脚本三剑客的用法

最近一直在研究shell脚本这块,刚好闲下来整了下自己手头上比较好的资料中的一些范例,以下是我整理的鸟哥私房菜里面正则表达式里面比较基础的一些语法详解,适合新手查阅。

首先先复制一段范例:

复制代码 代码如下:

# vi
regular_express.txt
-------------------------------
"Open Source" is a
good mechanism to develop programs.
apple is my favorite food.
Football
game is not use feet only.
this dress doesn‘t fit me.
However, this dress
is about $ 3183 dollars.
GNU is free air not free beer.
Her hair is very
beauty.
I can‘t finish the test.
Oh! The soup taste good.
motorcycle is
cheap than car.
This window is clear.
the symbol ‘*‘ is represented as
start.
Oh!My god!
The gd software is a library for drafting
programs.
You are the best is mean you are the no. 1.
The world
<Happy> is the same with "glad".
I like dog.
google is the best
tools for search keyword.
goooooogle yes!
go! go! Let‘s go.
# I am
VBird
--------------------------------

设置语系为C

复制代码 代码如下:

#export LANG=C

grep

1.搜寻特定字符串"the"
注: n为显示行号

复制代码 代码如下:

# grep -n ‘the‘ regular_express.txt

2.反向搜寻特定字符串"the"

复制代码 代码如下:

# grep -vn ‘the‘ regular_express.txt

3.取得任意大小写"the"的这个字符串

复制代码 代码如下:

# grep -in ‘the‘ regular_express.txt

4.利用括号 [] 来搜寻集合字符
搜索test或taste这两个单词时,发现他们有共同的‘t?st‘,所以可以这么搜寻

复制代码 代码如下:

# grep -n ‘t[ae]st‘
regular_express.txt

这样其实就是在找t[a]st和t[e]st这两个分开的字符
如果搜索有 oo
的字符时,则可以使用:

复制代码 代码如下:

# grep -n ‘oo‘
regular_express.txt

如果搜索oo时不想搜到 oo 前面有 g 的话,我们可以利用反向选择[^]来达成:

复制代码 代码如下:

# grep -n ‘[^g]oo‘ 
regular_express.txt

如果搜索oo前面不想有小写字符,则:

复制代码 代码如下:

# grep -n ‘[^a-z]oo‘
regular_express.txt

注: 大写英文/小写英文/数字 可以使用
[a-z]/[A-Z]/[0-9]等方式来书写,也可以写在一起
[a-zA-Z0-9]表示要求字符串是数字以及英文
如果我们要取得有数字的那行,则:

复制代码 代码如下:

# grep -n ‘[0-9]‘
regular_express.txt

注:但考虑到语系对编码顺序的影响,因此除了连续编码使用减号[-]外,也可以用[:lower:]代替a-z
以及 [:digit:] 代替0-9 使用

复制代码 代码如下:

# grep -n ‘[^[:lower:]]oo‘
regular_express.txt
# grep -n ‘[[:digit:]]‘ regular_express.txt

5.显示行首为‘the‘的字符串

复制代码 代码如下:

# grep -n ‘^the‘
regular_express.txt

显示行首是小写字符

复制代码 代码如下:

# grep -n ‘^[a-z]‘ regular_express.txt

6.显示行尾为点 . 的那一行

复制代码 代码如下:

# grep -n ‘\.$‘ regular_express.txt

7.显示5-9行数据

复制代码 代码如下:

# cat -An regular_express.txt |head -n 10 |tail
-n 6

8.显示空白行

复制代码 代码如下:

# grep -n ‘^$‘ regular_express.txt

9.找出g??d字符串,起头g结束d的四个字符串

复制代码 代码如下:

# grep -n ‘g..d‘ regular_express.txt

10. o*代表空字符(就是有没有字符都可以)或者一个到N个o字符,所以grep -n ‘o*‘
regular_express.txt就会把所有行全部打印出来,
11.oo*代表o+空字符或者一个到N个o字符,所以grep -n ‘oo*‘
regular_express.txt就会把o,oo,ooo等的行全部打印出来
12."goo*g"代表gog,goog,gooog...等

复制代码 代码如下:

# grep -n ‘goo*g‘ regular_express.txt

13.找出含g...g字符串的行
注: .代表任意字符, .*则就代表空字符或者一个到N个任意字符

复制代码 代码如下:

# grep -n ‘g.*g‘ regular_express.txt

14.找出含有数字的行

复制代码 代码如下:

# grep -n ‘[0-9][0-9]*‘
regular_express.txt

或# grep -n ‘[0-9]‘ regular_express.txt

15.找出含两个o的字符串
注:{}因为在shell里有特殊意义,所以需要加跳脱符\来让其失去意义

复制代码 代码如下:

# grep -n ‘o\{2\}‘ 
regular_express.txt

找出g后含2到5个o然后以g结尾的字符串

复制代码 代码如下:

# grep -n ‘go\{2,5\}g‘ 
regular_express.txt

找出g后含2以上的o然后以g结尾的字符串

复制代码 代码如下:

# grep -n ‘go\{2,\}g‘ 
regular_express.txt

总结:
^word     表示带搜寻的字符串(word)在行首
word$    
表示带搜寻的字符串(word)在行尾
.         表示1个任意字符
\        
表示转义字符,在特殊字符前加\会将原本的特殊字符意义去除
*         表示重复0到无穷多个前一个RE(正则表达式)字符
[list]   
表示搜索含有list的字符串
[n1-n2]   表示搜索指定的字符串范围,例如[0-9] [a-z] [A-Z]等
[^list]  
表示反向字符串的范围,例如[0-9]表示非数字字符,[A-Z]表示非大写字符范围
\{n,m\}  
表示找出n到m个前一个RE字符
\{n,\}    表示n个以上的前一个RE字符
egrep总结:
+   
表示重复一个或一个以上的前一个RE字符
范例:egrep ‘go+d‘
regular_express.txt
表示搜寻(god)(good)(goood)...等等字符串,o+代表[一个以上的o]
?   
表示重复零个或一个的前一个RE字符
范例:egrep ‘go?d‘
regular_express.txt
表示搜寻(gd)(god)字符串,o?代表[空的或1个o]
注:egrep下‘go+d‘和‘go?d‘的结果集合就等于grep下的‘go*d‘
|   
表示用或(or)的方式找出数个字符串
范例:egrep ‘gd|good|dog‘
regular_express.txt
表示搜寻(gd)或(god)或(god)字符串,|代表或
()   
表示找出群组字符串
范例:egrep ‘g(la|oo)d‘
regular_express.txt
表示搜寻(glad)或(good)字符串
()    +表示找出多个重复群组的判别
范例: echo
‘AxyzxyzxyzxyzxyzC‘|egrep ‘A(xyz)+C‘
表示搜寻开头是A结尾是C,中间有一个以上的‘xyz‘字符串

sed:

插入:

1.将/etc/passwd 的内容列出并打印行号,同时,将2-5行删除显示

复制代码 代码如下:

# nl /etc/passwd | sed ‘2,5d‘

注:
sed是sed -e的简写, 后接单引号
同上删除第2行

复制代码 代码如下:

# nl /etc/passwd | sed
‘2d‘

同上删除第三行到最后一行

复制代码 代码如下:

# nl /etc/passwd | sed ‘3,$d‘

2.在第二行后加上一行test

复制代码 代码如下:

# nl /etc/passwd | sed ‘2a
test‘

在第二行前加上一行test

复制代码 代码如下:

# nl /etc/passwd | sed ‘2i
test‘

在第二行后加入两行test

复制代码 代码如下:

# nl /etc/passwd | sed ‘2a test \
>
test‘

替换行:

3.将2-5行内容取代为 No 2-5 number

复制代码 代码如下:

# nl /etc/passwd | sed ‘2,5c No 2-5
number‘

4 列出/etc/passwd 内第5-7行

复制代码 代码如下:

# nl /etc/passwd |sed -n ‘5,7p‘

替换字符串:

sed ‘s/被替换字符串/新字符串/g‘

1.获取本机IP的行

复制代码 代码如下:

# /sbin/ifconfig eth0 |grep ‘inet
addr‘

将IP前面的部分予以删除

复制代码 代码如下:

# /sbin/ifconfig eth0 |grep ‘inet addr‘| sed
‘s/^.*addr://g‘

将IP后面的部分删除

复制代码 代码如下:

# /sbin/ifconfig eth0 |grep ‘inet addr‘| sed
‘s/^.*addr://g‘| sed
‘s/Bcast:.*$//g‘
-------------------
192.168.100.74
-------------------

2.用grep将关键词MAN所在行取出来

复制代码 代码如下:

# cat /etc/man.config |grep
‘MAN‘

删除批注行

复制代码 代码如下:

# cat /etc/man.config |grep ‘MAN‘| sed
‘s/^#.*$//g‘

删除空白行

复制代码 代码如下:

# cat /etc/man.config |grep ‘MAN‘| sed
‘s/^#.*$//g‘| sed ‘/^$/d‘

3.利用sed将regular_express.txt内每一行若为.的换成!
注:-i参数会直接修改文本,而并非直接输出

复制代码 代码如下:

# sed -i ‘s/.*\.$/\!/g‘
regular_express.txt

4.利用sed在文本最后一行加入 #This is a test
注: $代表最后一行 a代表行后添加

复制代码 代码如下:

# sed -i ‘$a #This is a test‘
regular_express.txt

将selinux配置文件enforcing改成disabled

复制代码 代码如下:

# sed -i ‘6,6c SELINUX=disabled‘
/etc/selinux/config

延伸正规表示法:

复制代码 代码如下:

# grep -v ‘^$‘ regular_express.txt |grep -v
‘^#‘

延伸写法:

复制代码 代码如下:

# egrep -v ‘^$‘|‘^#‘ regular_express.txt

1. +表示重复一个或一个以上的前一个RE字符

例如:egrep -n ‘go+d‘ regular_express.txt
普通写法: grep -n ‘goo*d‘
regular_express.txt

2. ?表示重复零个或一个前一个RE字符

例如: egrep -n ‘go?d‘ regular_express.txt

3. |表示用或的方式找出数个字符串

例如: egrep -n ‘gd|good‘ regular_express.txt

4. ()表示找出群组字符串

例如: egrep -n ‘g(la|oo)d‘ regular_express.txt
也就是搜寻(glad)或good这两个字符串

5. ()+多个重复群组判别

例如: echo ‘AxyzxyzxyzxyzC‘|egrep ‘A(xyz)+C‘

也就是要找开头是A结尾是C 中间有一个以上的‘xyz‘字符串的意思

awk:

1.用last取出登陆数据前五行

复制代码 代码如下:

# last -n
5

取出账号与登陆者IP,且账号与IP之间以TAB隔开

复制代码 代码如下:

# last -n 5 |awk ‘{print $1 "\t"
$3}‘

注:$1代表用空格或TAB隔开的第一个字段,以此类推。。
  $0代表该行全部字段

复制代码 代码如下:

# last -n 5 |awk ‘{print $1 "\t lines:" NR "\t
columes:" NF}‘

注: NF代表每一行的$0的字段总数
   NR代表目前awk所处的是第几行数据
  
FS代表目标分隔符,默认为空格

2.在/etc/passwd中以:来作为分段字符,则我们要查阅第三栏小于10以下的数据,并只列出账号与第三栏

复制代码 代码如下:

# cat /etc/passwd | awk ‘{FS=":"} $3<10
{print $1 "\t \t"$3}‘

注:查询结果未显示第一行数据,是因为我们虽然定义了FS=":"
但却只能在第二行生效
想读取第一行就需要BEGIN这个关键词:

复制代码 代码如下:

# cat /etc/passwd | awk ‘BEGIN {FS=":"}
$3<10 {print $1 "\t \t"$3}‘

df:
比较两个文件的差异:

复制代码 代码如下:

# diff /etc/rc3.d/
/etc/rc5.d/
-------------------
Only in /etc/rc3.d/:
K30spice-vdagentd
Only in /etc/rc5.d/:
S70spice-vdagentd
-------------------

实例:
1。统计TCP连接状态

复制代码 代码如下:

# netstat -na | awk ‘/^tcp/ {++S[$NF]} END
{for(a in S) print a,
S[a]}‘
/^tcp/

过滤出以tcp开头的行,“^”为正则表达式用法,以...开头,这里是过滤出以tcp开头的行。
S[]
定义了一个名叫S的数组,在awk中,数组下标通常从
1 开始,而不是
0。
NF
当前记录里域个数,默认以空格分隔,如上所示的记录,NF域个数等于
$NF
表示一行的最后一个域的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是SYN_RECV或TIME_WAIT等。
S[$NF]
表示数组元素的值,如上所示的记录,就是S[TIME_WAIT]状态的连接数
++S[$NF]
表示把某个数加一,如上所示的记录,就是把S[TIME_WAIT]状态的连接数加一
结果就是显示S数组中最终的数组值
例:S[TIME_WAIT]=最终值
S[TESTABLISHED]=最终值
END
for(key in S)
遍历S[]数组
print
key,”\t”,S[key]
打印数组的键和值,中间用\t制表符分割,显示好一些。

最近一直在研究shell脚本这块,刚好闲下来整了下自己手头上比较好的资料中的一些范例,以下是我整理的鸟哥私房菜里面正则表达式里面比较基础的一些语法详解,适合新手查阅。

首先先复制一段范例:

复制代码 代码如下:

# vi
regular_express.txt
-------------------------------
"Open Source" is a
good mechanism to develop programs.
apple is my favorite food.
Football
game is not use feet only.
this dress doesn‘t fit me.
However, this dress
is about $ 3183 dollars.
GNU is free air not free beer.
Her hair is very
beauty.
I can‘t finish the test.
Oh! The soup taste good.
motorcycle is
cheap than car.
This window is clear.
the symbol ‘*‘ is represented as
start.
Oh!My god!
The gd software is a library for drafting
programs.
You are the best is mean you are the no. 1.
The world
<Happy> is the same with "glad".
I like dog.
google is the best
tools for search keyword.
goooooogle yes!
go! go! Let‘s go.
# I am
VBird
--------------------------------

设置语系为C

复制代码 代码如下:

#export LANG=C

grep

1.搜寻特定字符串"the"
注: n为显示行号

复制代码 代码如下:

# grep -n ‘the‘ regular_express.txt

2.反向搜寻特定字符串"the"

复制代码 代码如下:

# grep -vn ‘the‘ regular_express.txt

3.取得任意大小写"the"的这个字符串

复制代码 代码如下:

# grep -in ‘the‘ regular_express.txt

4.利用括号 [] 来搜寻集合字符
搜索test或taste这两个单词时,发现他们有共同的‘t?st‘,所以可以这么搜寻

复制代码 代码如下:

# grep -n ‘t[ae]st‘
regular_express.txt

这样其实就是在找t[a]st和t[e]st这两个分开的字符
如果搜索有 oo
的字符时,则可以使用:

复制代码 代码如下:

# grep -n ‘oo‘
regular_express.txt

如果搜索oo时不想搜到 oo 前面有 g 的话,我们可以利用反向选择[^]来达成:

复制代码 代码如下:

# grep -n ‘[^g]oo‘ 
regular_express.txt

如果搜索oo前面不想有小写字符,则:

复制代码 代码如下:

# grep -n ‘[^a-z]oo‘
regular_express.txt

注: 大写英文/小写英文/数字 可以使用
[a-z]/[A-Z]/[0-9]等方式来书写,也可以写在一起
[a-zA-Z0-9]表示要求字符串是数字以及英文
如果我们要取得有数字的那行,则:

复制代码 代码如下:

# grep -n ‘[0-9]‘
regular_express.txt

注:但考虑到语系对编码顺序的影响,因此除了连续编码使用减号[-]外,也可以用[:lower:]代替a-z
以及 [:digit:] 代替0-9 使用

复制代码 代码如下:

# grep -n ‘[^[:lower:]]oo‘
regular_express.txt
# grep -n ‘[[:digit:]]‘ regular_express.txt

5.显示行首为‘the‘的字符串

复制代码 代码如下:

# grep -n ‘^the‘
regular_express.txt

显示行首是小写字符

复制代码 代码如下:

# grep -n ‘^[a-z]‘ regular_express.txt

6.显示行尾为点 . 的那一行

复制代码 代码如下:

# grep -n ‘\.$‘ regular_express.txt

7.显示5-9行数据

复制代码 代码如下:

# cat -An regular_express.txt |head -n 10 |tail
-n 6

8.显示空白行

复制代码 代码如下:

# grep -n ‘^$‘ regular_express.txt

9.找出g??d字符串,起头g结束d的四个字符串

复制代码 代码如下:

# grep -n ‘g..d‘ regular_express.txt

10. o*代表空字符(就是有没有字符都可以)或者一个到N个o字符,所以grep -n ‘o*‘
regular_express.txt就会把所有行全部打印出来,
11.oo*代表o+空字符或者一个到N个o字符,所以grep -n ‘oo*‘
regular_express.txt就会把o,oo,ooo等的行全部打印出来
12."goo*g"代表gog,goog,gooog...等

复制代码 代码如下:

# grep -n ‘goo*g‘ regular_express.txt

13.找出含g...g字符串的行
注: .代表任意字符, .*则就代表空字符或者一个到N个任意字符

复制代码 代码如下:

# grep -n ‘g.*g‘ regular_express.txt

14.找出含有数字的行

复制代码 代码如下:

# grep -n ‘[0-9][0-9]*‘
regular_express.txt

或# grep -n ‘[0-9]‘ regular_express.txt

15.找出含两个o的字符串
注:{}因为在shell里有特殊意义,所以需要加跳脱符\来让其失去意义

复制代码 代码如下:

# grep -n ‘o\{2\}‘ 
regular_express.txt

找出g后含2到5个o然后以g结尾的字符串

复制代码 代码如下:

# grep -n ‘go\{2,5\}g‘ 
regular_express.txt

找出g后含2以上的o然后以g结尾的字符串

复制代码 代码如下:

# grep -n ‘go\{2,\}g‘ 
regular_express.txt

总结:
^word     表示带搜寻的字符串(word)在行首
word$    
表示带搜寻的字符串(word)在行尾
.         表示1个任意字符
\        
表示转义字符,在特殊字符前加\会将原本的特殊字符意义去除
*         表示重复0到无穷多个前一个RE(正则表达式)字符
[list]   
表示搜索含有list的字符串
[n1-n2]   表示搜索指定的字符串范围,例如[0-9] [a-z] [A-Z]等
[^list]  
表示反向字符串的范围,例如[0-9]表示非数字字符,[A-Z]表示非大写字符范围
\{n,m\}  
表示找出n到m个前一个RE字符
\{n,\}    表示n个以上的前一个RE字符
egrep总结:
+   
表示重复一个或一个以上的前一个RE字符
范例:egrep ‘go+d‘
regular_express.txt
表示搜寻(god)(good)(goood)...等等字符串,o+代表[一个以上的o]
?   
表示重复零个或一个的前一个RE字符
范例:egrep ‘go?d‘
regular_express.txt
表示搜寻(gd)(god)字符串,o?代表[空的或1个o]
注:egrep下‘go+d‘和‘go?d‘的结果集合就等于grep下的‘go*d‘
|   
表示用或(or)的方式找出数个字符串
范例:egrep ‘gd|good|dog‘
regular_express.txt
表示搜寻(gd)或(god)或(god)字符串,|代表或
()   
表示找出群组字符串
范例:egrep ‘g(la|oo)d‘
regular_express.txt
表示搜寻(glad)或(good)字符串
()    +表示找出多个重复群组的判别
范例: echo
‘AxyzxyzxyzxyzxyzC‘|egrep ‘A(xyz)+C‘
表示搜寻开头是A结尾是C,中间有一个以上的‘xyz‘字符串

sed:

插入:

1.将/etc/passwd 的内容列出并打印行号,同时,将2-5行删除显示

复制代码 代码如下:

# nl /etc/passwd | sed ‘2,5d‘

注:
sed是sed -e的简写, 后接单引号
同上删除第2行

复制代码 代码如下:

# nl /etc/passwd | sed
‘2d‘

同上删除第三行到最后一行

复制代码 代码如下:

# nl /etc/passwd | sed ‘3,$d‘

2.在第二行后加上一行test

复制代码 代码如下:

# nl /etc/passwd | sed ‘2a
test‘

在第二行前加上一行test

复制代码 代码如下:

# nl /etc/passwd | sed ‘2i
test‘

在第二行后加入两行test

复制代码 代码如下:

# nl /etc/passwd | sed ‘2a test \
>
test‘

替换行:

3.将2-5行内容取代为 No 2-5 number

复制代码 代码如下:

# nl /etc/passwd | sed ‘2,5c No 2-5
number‘

4 列出/etc/passwd 内第5-7行

复制代码 代码如下:

# nl /etc/passwd |sed -n ‘5,7p‘

替换字符串:

sed ‘s/被替换字符串/新字符串/g‘

1.获取本机IP的行

复制代码 代码如下:

# /sbin/ifconfig eth0 |grep ‘inet
addr‘

将IP前面的部分予以删除

复制代码 代码如下:

# /sbin/ifconfig eth0 |grep ‘inet addr‘| sed
‘s/^.*addr://g‘

将IP后面的部分删除

复制代码 代码如下:

# /sbin/ifconfig eth0 |grep ‘inet addr‘| sed
‘s/^.*addr://g‘| sed
‘s/Bcast:.*$//g‘
-------------------
192.168.100.74
-------------------

2.用grep将关键词MAN所在行取出来

复制代码 代码如下:

# cat /etc/man.config |grep
‘MAN‘

删除批注行

复制代码 代码如下:

# cat /etc/man.config |grep ‘MAN‘| sed
‘s/^#.*$//g‘

删除空白行

复制代码 代码如下:

# cat /etc/man.config |grep ‘MAN‘| sed
‘s/^#.*$//g‘| sed ‘/^$/d‘

3.利用sed将regular_express.txt内每一行若为.的换成!
注:-i参数会直接修改文本,而并非直接输出

复制代码 代码如下:

# sed -i ‘s/.*\.$/\!/g‘
regular_express.txt

4.利用sed在文本最后一行加入 #This is a test
注: $代表最后一行 a代表行后添加

复制代码 代码如下:

# sed -i ‘$a #This is a test‘
regular_express.txt

将selinux配置文件enforcing改成disabled

复制代码 代码如下:

# sed -i ‘6,6c SELINUX=disabled‘
/etc/selinux/config

延伸正规表示法:

复制代码 代码如下:

# grep -v ‘^$‘ regular_express.txt |grep -v
‘^#‘

延伸写法:

复制代码 代码如下:

# egrep -v ‘^$‘|‘^#‘ regular_express.txt

1. +表示重复一个或一个以上的前一个RE字符

例如:egrep -n ‘go+d‘ regular_express.txt
普通写法: grep -n ‘goo*d‘
regular_express.txt

2. ?表示重复零个或一个前一个RE字符

例如: egrep -n ‘go?d‘ regular_express.txt

3. |表示用或的方式找出数个字符串

例如: egrep -n ‘gd|good‘ regular_express.txt

4. ()表示找出群组字符串

例如: egrep -n ‘g(la|oo)d‘ regular_express.txt
也就是搜寻(glad)或good这两个字符串

5. ()+多个重复群组判别

例如: echo ‘AxyzxyzxyzxyzC‘|egrep ‘A(xyz)+C‘

也就是要找开头是A结尾是C 中间有一个以上的‘xyz‘字符串的意思

awk:

1.用last取出登陆数据前五行

复制代码 代码如下:

# last -n
5

取出账号与登陆者IP,且账号与IP之间以TAB隔开

复制代码 代码如下:

# last -n 5 |awk ‘{print $1 "\t"
$3}‘

注:$1代表用空格或TAB隔开的第一个字段,以此类推。。
  $0代表该行全部字段

复制代码 代码如下:

# last -n 5 |awk ‘{print $1 "\t lines:" NR "\t
columes:" NF}‘

注: NF代表每一行的$0的字段总数
   NR代表目前awk所处的是第几行数据
  
FS代表目标分隔符,默认为空格

2.在/etc/passwd中以:来作为分段字符,则我们要查阅第三栏小于10以下的数据,并只列出账号与第三栏

复制代码 代码如下:

# cat /etc/passwd | awk ‘{FS=":"} $3<10
{print $1 "\t \t"$3}‘

注:查询结果未显示第一行数据,是因为我们虽然定义了FS=":"
但却只能在第二行生效
想读取第一行就需要BEGIN这个关键词:

复制代码 代码如下:

# cat /etc/passwd | awk ‘BEGIN {FS=":"}
$3<10 {print $1 "\t \t"$3}‘

df:
比较两个文件的差异:

复制代码 代码如下:

# diff /etc/rc3.d/
/etc/rc5.d/
-------------------
Only in /etc/rc3.d/:
K30spice-vdagentd
Only in /etc/rc5.d/:
S70spice-vdagentd
-------------------

实例:
1。统计TCP连接状态

复制代码 代码如下:

# netstat -na | awk ‘/^tcp/ {++S[$NF]} END
{for(a in S) print a,
S[a]}‘
/^tcp/

过滤出以tcp开头的行,“^”为正则表达式用法,以...开头,这里是过滤出以tcp开头的行。
S[]
定义了一个名叫S的数组,在awk中,数组下标通常从
1 开始,而不是
0。
NF
当前记录里域个数,默认以空格分隔,如上所示的记录,NF域个数等于
$NF
表示一行的最后一个域的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是SYN_RECV或TIME_WAIT等。
S[$NF]
表示数组元素的值,如上所示的记录,就是S[TIME_WAIT]状态的连接数
++S[$NF]
表示把某个数加一,如上所示的记录,就是把S[TIME_WAIT]状态的连接数加一
结果就是显示S数组中最终的数组值
例:S[TIME_WAIT]=最终值
S[TESTABLISHED]=最终值
END
for(key in S)
遍历S[]数组
print
key,”\t”,S[key]
打印数组的键和值,中间用\t制表符分割,显示好一些。

时间: 2024-08-04 03:00:55

脚本三剑客的用法的相关文章

linux脚本命令的用法

grep命令的用法 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. 参数: 1. -A NUM,--after-context=NUM   除了列出符合行之外,并且列出后NUM行. 如:   $ grep –A 1 panda file  (从file中搜寻有panda样式的行,并显示该行的后1行) 2

Shell脚本三剑客(awk、sort、uniq)内含多个小Demo

awk工具 在Linux/UNIX系统中,awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以再无交互的情况下实现相当复杂的文本操作,被广泛应用于Shell脚本,完成各种自动化配置任务. 1.awk常见用法:通常情况下 awk 所使用的命令格式如下所示,其中,单引号加上大括号"{}"用于设置对数据进行的处理动作.awk 可以直接处理目标文件,也可以通过"-f"读取脚本对目标文件进行处理. D

Shell脚本三剑客——Grep(进阶版egrep)、Sed、Awk命令

Grep命令 1.基本正则表达式实例--查找特定字符 这里我们就以存放本机所有用户的/etc/passwd文件做实例 Demo1 [[email protected] ~]# grep -n "root" /etc/passwd //-n表示显示行号 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin 2.基本正则表达式实例--查找集合字符 有重复的字符时,可使用"

shell脚本的引用用法说明

#!/bin/bash#演示全引用和部分引用#双引号和没引号的区别variable1=2010echo "$variable1"echo $variable1variable2="x    y     z"    ##字符之间用多个空格隔开echo "$variable2"           ##双引号 echo $variable2             ##没引号 #单引号和双引号的区别echo "$PWD is the cur

shell脚本ping -w用法

今天写了一个循环ping的脚本用来扫描网段中一些不通的ip地址,代码如下: #!/bin/bash ping_info(){ ping -c 2 -w 1 $1; if(($?!=0)); then echo $1 >> /tmp/iplist; fi; } for i in `seq 129 254`;do ip_dx=192.168.1.$i ip_lt=192.168.2.$i ip_yd=192.168.3.$i ping_info $ip_dx ping_info $ip_lt pi

转帖-shell脚本$与if用法

$# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 [email protected] 是传给脚本的所有参数的列表 $* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个 $$ 是脚本运行的当前进程ID号 $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误 $! 后台运行的最后一个进程的ID号 [email protected] 与$#相同,但是使用时加引号,并在引号中返回

Unity3D教程:c#脚本yield的用法

Coroutines & Yield是Unity3D编程中重要的概念,它可以实现将一段程序延迟执行或者将其各个部分分布在一个时间段内连续执行,但是在Javascript与C#中实现Coroutines & Yield,在语法上却有一些区别: javascript中yield用法很简单,直接yield就行了,或者yield WaitForSeconds (2); c#中的用法如下: yield不可单独使用 需要与return配合使用,例如: 1 yield return 0; //等0帧 2

shell脚本的测试用法

#!/bin/bash#1.整数比较运算符#整数变量和整数常量比较num1=15[ "$num1" -eq 15 ]    #测试num1是否等于15echo $?      ##退出状态为0,表示num1等于15 [ "$num1" -eq 20 ]   #测试num1是否等于20echo $?    ##退出状态为1,表示num1不等于20 [ "$num1" -lt 15 ]   ##测试num1是否小于15echo $?         

tomcat脚本简要分析

tomcat的脚本在bin目录下,有:catalina.startup.shutdown.setenv.digest.version等. 其中catalina 脚本 用于启动和关闭tomcat 服务器 ,是tomcat中最关键的脚本. startup 脚本 和shutdown 脚本等 都是使用了不同的参数调用了catalina脚本: startup 脚本 以start参数调用了catalina脚本,shutdown脚本以stop参数调用了catalina脚本. catalina用法(摘自cata