一、grep使用
...
语法: grep [-cinvABC] 'word' filename

-c :打印符合要求的行数

-i :忽略大小写

-n :在输出符合要求的行的同时连同行号一起输出

-v :打印不符合要求的行

-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行

-B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行

-C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行
...
grep -n 'root' /etc/passwd
过滤出带关键字root的行并输出行号
grep -nv 'root' /etc/passwd
v是取反的意思
过滤出不带关键字root的行并输出行号
...
grep '^[^a-zA-Z]' test.txt
[^]表示不在这个范围内的
^代表以后面的开头的
...
grep -v '^#' /etc/crontab |grep -v '^$'
正则中^表示以什么开头的行,^$表示以什么结尾的行
'^$'可以表示空行
...
grep 'r..o' /etc/passwd
.代表一个任意字符
上例中,就是把符合r与o之间有两个任意字符的行过滤出来
...
grep 'ooo' /etc/passwd
ooo
表示o或oo或ooo或更多的o,代表任意个
...
grep '.
' /etc/passwd |wc -l
'.'表示0个过着多个任意字符
空行也包含在内
...
grep 'o{2}' /etc/passwd
过滤出现'oo'的行
花括号 { 和 } 的左边都需要加上转义字符 '\',
{}里还可以写成{n1,n2}的形式,
大于n1小于n2次的,
n2可以为空,表示大于等于n1次的
...
二、sed使用
sed -n '2'p /etc/passwd
p是print打印的意思
单引号内的 '2'表示第几行
sed -n '1,$'p /etc/passwd
这样表示打印所有的行
sed -n '2,4'p /etc/passwd
这样表示一个区间,第二行到第四行
...
sed -n '/root/'p test.txt
表示打印含有字符串root的行
grep中的
$ . ^ 同样可以使用
sed -n '/ooo/'p test.txt
...
sed -e '1'p -e '/111/'p -n test.txt
-e可以实现多个行为
打印第一行和包含111的行
...
sed '1'd test.txt
sed '/root/'d test.txt
sed '1,3'd test.txt
删除某行或包含某字符的行或多行
...
sed '1,2s/ot/to/g' test.txt
用to替换1到2行的ot
s为替换的意思,g是全局的意思,
如果不加 ‘g’ 只换该行中出现的第一个
/分隔符也可以换成其他特殊字符如# @

sed '1,3s@to@ot@g' test.txt
...
sed 's/[0-9]//g' test.txt
替换所有的数字
sed -e 's@[1-9]@@g' -e 's/[a-zA-Z]//g' test.txt
tihua替换所有的数字和字母
...
sed 's@(rot)(.)(bash)@\3\2\1@' test.txt
此题可把rot对应着3,rot与bash中间的字符对应着2,bash对应着1
然后把它们按照123的顺序排列出来。
例如test.txt原来里的内容为rot:123:bash
命令执行后输出bash:123:rot
...
sed 's/^.
$/123&/' test.txt
匹配任意字符开头任意字符结尾的行,并把行首字符替换为123
加上&不覆盖原行内容
.代表任意一个字符,*表示前面字符的任意个
...
sed -i 's/ro/to/g' test.txt
直接修改源文件的内容

三、awk的使用
head -n2 /etc/passwd |awk -F ':' '{print $1}'
-F 选项的作用是指定分隔符,如果不加-F指定,则以空格或者tab为分隔符,print $1是打印第几个段,$0是打印所有
...
head -n2 test.txt |awk -F':' '{print $1"#"$2"#"$3"#"$4}'
{}里面也可以自定义内容,但是自定义的内容必须加上双引号。
...
awk '/oo/' 1.txt
匹配字符串
...
awk -F ':' '$1 ~/oo/' test.txt
匹配1段里包含oo的行,其中~就是匹配的意思
...
awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' /etc/passwd
匹配、etc/passwd文件中包含字符串root的行的第一和第三段。
...
awk -F ':' '$3=="0"' /etc/passwd

awk -F ':' '$3=="0" {print $3}' /etc/passwd
p匹配第三段字符串为0的行,如果不加引号 ,则认为是数值为0
...
awk -F ':' '$3>="500"' /etc/passwd
jo结果不如我们所料,因为awk把所有数字都认为字符串处理了
...
awk常用的变量有:

NF :用分隔符分隔后一共有多少段

NR :行数
[root@localhost ~]# head -n3 /etc/passwd | awk -F ':' '{print NF}'
7
7
7
[root@localhost ~]# head -n3 /etc/passwd | awk -F ':' '{print $NF}'
/bin/bash
/sbin/nologin
/sbin/nologin
NF 是多少段,而$NF是最后一段的值, 而NR则是行号。
...
也可以使用行号作为判断条件
awk 'NR>20' /etc/passwd
awk -F ':' 'NR>20 && $1 ~ /ssh/' /etc/passwd也可以配合段匹配一起使用
...
head -n 3 /etc/passwd |awk -F ':' '$1="root"'
awk可以把段值更改
...
awk还可以对各个段的值进行数学运算:

[root@iz2ze68lretu4tuz8o34amz ~]# cat 2.txt
1:2:3
1:2:3:4
[root@iz2ze68lretu4tuz8o34amz ~]# head -n2 2.txt|awk -F ':' '{$3=$2+$2}'
[root@iz2ze68lretu4tuz8o34amz ~]# head -n2 2.txt|awk -F ':' '{$3=$2+$2; print $0}'
1 2 4
1 2 4 4
...