9.1 正则介绍_grep上
9.2 grep中
9.3 grep下
9.4/9.5 sed
9.6/9.7 awk
9.8扩展
9.9课堂笔记
9.1 正则介绍_grep上
grep [-cinvABC] 'word' filename
-c 行数
[root@xinlinux-02 ~]#
grep -c "login" /etc/passwd
17
-i 不区分大小写
[root@xinlinux-02 ~]#
grep -n "a" 1.txt
1:aaaaaaaaaa
3:aaaaaaaaaa
[root@xinlinux-02 ~]#
grep -ni "a" 1.txt
1:aaaaaaaaaa
2:AAAAAAAAAAAAAA
3:aaaaaaaaaa
4:AAAAAAAAAA
-n 显示行号
[root@xinlinux-02 ~]#
grep -n "a" 1.txt
1:aaaaaaaaaa
3:aaaaaaaaaa
-v 取反
[root@xinlinux-02 ~]#
grep -v "a" 1.txt
AAAAAAAAAAAAAA
AAAAAAAAAA
-A 后面跟数字,过滤出
符合要求的行以及下面n行
[root@xinlinux-02 ~]#
cat 1.txt
aaaaa
AAAA
AAA
aaaa
123
465
145
[root@xinlinux-02 ~]#
grep -A2 "123" 1.txt
123
465
145
-B 后面跟数字,过滤出符合
要求的行以及上面n行
[root@xinlinux-02 ~]#
grep -B2 "123" 1.txt
AAA
aaaa
123
-C 后面跟数字,过滤出符合
要求的行以及上下各n行
[root@xinlinux-02 ~]#
grep -C2 "123" 1.txt
AAA
aaaa
123
465
145
-r 目录 遍历该目录下所有子目录
[root@xinlinux-02 ~]#
grep "passwd" /etc/
grep: /etc/: 是一个目录
[root@xinlinux-02 ~]#
grep -r "passwd" /etc/
/etc/login.defs:# passwd command) should therefore be configured elsewhere. Refer to
/etc/default/nss:# If set to TRUE, the passwd routines in the NIS NSS module will not
/etc/default/nss:# use the passwd.adjunct.byname tables to fill in the password data
9.2 grep中
###^在外面表示以什么开头,在方括号里面表示否,非的意思
grep -n 'root' /etc/passwd
#/etc/passwd 找含有root的行并显示行号
grep -nv 'nologin' /etc/passwd
#取反,/etc/passwd 找含有不包含nologin的行并显示行号
grep '[0-9]' /etc/inittab
#/etc/inittab里面过滤出带数字的行
grep -v '[0-9]' /etc/inittab
#/etc/inittab里面过滤出不包含数字的行
grep -v '^#' /etc/inittab
#/etc/sos.conf里面过滤出不含注释符#的行
grep -v '^#' /etc/inittab |grep -v '^$' == grep -v '^#
| ^$' /etc/inittab
#/etc/inittab内过滤出非注释行和非空行
grep '^[^a-zA-Z]' test.txt
#过滤出以非字母开头的行
9.3 grep下
egrep为grep的增强版,可以识别特殊字符,不需要用脱义符"\"
grep 'r.o' test.txt
#" . "点表示任意一个字符,过滤出text.txt内含有r( )0的行;()表示任意一个字符
grep 'o*o' test.txt
# " * "代表(可为0)任意个*号前面的那个字符
grep '.*' test.txt
# " .* "表示匹配任意所有字符,包括空行
grep 'o\{2\}' /etc/passwd == egrep 'o{2}' /etc/passwd == grep -E 'o{2}' /etc/passwd
# " { } "花括号表示范围,过滤/etc/passwd内包含2个o的行
egrep 'o+' /etc/passwd
# " + "加号表示+号前字符出现1次或以上,过滤/etc/passwd内出现一次o以上的行
egrep 'oo?' /etc/passwd
# " ? "表示问号前一个字符出现0次或者1次,过滤/etc/passwd内含有oo、o的行
egrep ''root | nonlogin' /etc/passwd
#过滤出/etc/passwd内含有root或者nonogin的行
egrep '(oo){2}' /etc/passwd
#过滤/etc/passwd内出现2次oo的行
9.4/9.5 sed
#sed能实现grep的功能,但是麻烦,也不会显示颜色;
所以sed主要用于替换
#sed也支持正则表达式,包括特殊字符
查找字符串
sed -n '/root/ 'p 1.txt
# ' ' 单引号里面如果是字符串的话需要加上双斜杠//
指定行
sed -n '2'p 1.txt #打印出1.txt的第二行
#' ' 单引号里面如果是数字的话,表示打印指定行
指定范围行
sed -n ' 2,6'p 1.txt #打印出1.txt的第二行到第六行
sed -n ' 2,$'p 1.txt #打印出1.txt的第二行到行尾
sed -n ' 1,$'p 1.txt #打印出1.txt的全文
-e表示在一条命令执行多个操作,相互不会影响
sed -e '1'p -e'/111/'p -n 1.txt
#打印1.txt第一行的同时打印含有字符串111的行
ps:如果多个命令间查找的结果相同,会重复打印出来
sed查找打印不区分大小写
#在p前面加一个大写的i,
sed -n '/root/ 'Ip 1.txt
#打印1.txt内不区分大小写的root字符串的行
sed删除并打印删除后的内容d
sed '1, 10'd 1.txt #删除1.txt内第1到10行的内容后打印出来
sed '/root/'d 1.txt #删除所含root字符串所在行后打印出来
sed -r #使特殊字符生效
加-i ,可直接删除查找行内容 (有些危险)
sed -i '1, 10'd 1.txt #删除
sed替换(与vim的替换相似)
sed '1,10s/root/toor/g' 1.txt
#将1.txt第一到十行内全局替换,root换成toor
sed -r '1,10s/ro+/toor/g' 1.txt
1、替换内容时,有/,需要用\
head passwd |sed 's/\/sbin\/nologin/123/g'
2、或者使用@、#等替换分隔符
head passwd |sed 's@/sbin/nologin@123@g'
sed 's/[a-zA-Z]//g #把英文字母全部删除,相当于替换为空
将第一段和最后一段调换位置
sed -r ‘s/([^:]+):(.*):([^:]+)/\3:\2:\1/’
([^:]+) 非冒号,一个或多个 1
:(.*): 贪婪匹配,一直匹配到最后一个冒号 2
([^:]+) 非冒号,一个或多个 3
#前面用小括号()括起来的,后面要用反斜杠\数字去表示
\3:\2:\1 将1,2,3分别代表([^:]+) 、:(.*): 、([^:]+),即\1:\2:\3,调换顺序就是调换位置
9.6/9.7 awk
#支持分段,可以针对段做匹配,支持正则表达式(也支持特殊符号,不需要加脱义字符"/")
#若是不-F指定分隔符,会默认空格或者空字符为分隔符
1、
awk -F ':' '{print $1}' 1.txt
#选取1.txt通过awk用":"冒号分段,取$1第一段内容
awk -F ':' '{print $1,$3,$4}' 1.txt
#取$1、$3、$4第一段、第三段、第四段内容
awk -F ':' '{print $0}' 1.txt
#$0取所有段的内容
awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
#手动添加分隔符
2、awk匹配功能
awk '/oo/' 1.txt
#将含有oo字符串的匹配出来
awk -F ':' '$1~/oo/'1.txt
#将第一段含有oo字符串的匹配出来
3、awk支持多个表达式一起写
awk -F ':' '/root/ {print $1,$3} /user/ {print $3,$4}' 1.txt
#将含有root的行打印第一段和第三段内容,同时将含有user的行打印第三段和第四段内容
4、awk数学运算表达式
awk -F ':' '$3==1000' /etc/passwd
#匹配第三段等于1000的行
awk -F ':' '$3==''1000''' /etc/passwd
#匹配第三段等于通过ascii配对1000获得值的行
#针对数字的不要加双引号,加了双引号系统会通过ASCII码进行匹配
awk -F ':' '$3==1000 {print $1}' /etc/passwd
#匹配第三段等于1000的行列出第一段
awk -F ':' '$7!="/sbin/nologin"' /etc/passwd
#" != "表示不等于; 匹配第七行不等于/sbin/nologin的行
5、awk字段间比较
awk -F ':' '$3>$4' /wtc/passwd
#匹配第三段大于第四段的行
awk -F ':' '$3==$4' /wtc/passwd
#匹配第三段等于第四段的行
awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
#匹配第三段大于5且小于7的行
awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd
#匹配第三段大于1000或者第七段等于/bin/bash的行
6、OFS内置变量
awk -F ':' '{OFS="#"} 匹配条件 {print $1,$3,$4}' /etc/passwd
#将匹配到的第一、三、四段的内容用"#"号分隔符分隔
#
{OFS="#"},OFS:内置变量,表示指定print时用到的分隔符
#两个花括号之间写匹配的条件
awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$3,$4}}' /etc/passwd
#匹配第三段内容大于1000的行,将第一、第三、第四段输出并用"#"号隔开
7、内置变量NF(段数)、NR(行号)
awk -F ':' '{print NF}'
#将段数显示出来
awk -F ':' '{print NF":"$0}' /etc/passwd
#将所有段的段数显示出来
awk -F ':' '{print NR}'
#将行号显示出来
awk -F ':' '{print NR":"$0}' /etc/passwd
#将所有段的行号显示出来
awk 'NR>40' /etc/passwd
#把从第41行开始的行显示出来
awk -F ':' 'NR<20 && $1~/roo/' /etc/passwd
#把行号小于20行且第一段为roo的匹配出来
awk -F ':' '{print $NR":"$NF}' /etc/passwd
#passwd一共只有7段, 所以$NF=$7;$NR则是从$1开始一直下去
8、赋值"="号,赋值后分隔符会消失
head -n3 /etc/passwd |awk -F ':' '$1="root" '
#将passwd的第一段内容赋值为root
head -n3 /etc/passwd |awk -F ':' {OFS=":"} '$1="root" '
#将赋值后的内容定义分隔符为":"冒号
awk -F ':' '{if ($1="root") {print $0}}' /etc/passwd
#将passwd的第一段内容赋值为root,然后输出所有段
9、"=="等于号
head -n3 /etc/passwd |awk -F ':' '$1=="root" '
#匹配第一段为root的内容
10、求和第三段所有列的和 (tot表示求和,默认从0开始)
awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd
#{(tot=tot+$3)}:tot值表示每次循环都会把第三段的值相加,即第一行的第三段加第二行的第三段,一直循环加下去,就是求和第三段所有列的和
9.8扩展
把一个目录下,过滤所有*.php文档中含有eval的行
grep -r --include="*.php" 'eval' /data/
把这里面的所有练习题做一下
9.9课堂笔记
一、ps:笔记修改
raid5: 没有单独盘作为校验盘,而是每块盘上有校验位;磁盘上的数据与该盘的校验数据分布在不同盘上
raid6:用了两个校验算法,假设两种校验数据为p和q,pq则分布在不同的两个数据盘上
二、| 与 || &与&& (面试可能问到)
1、| 与 || 的区别
| 管道符,用于将上条命令的结果作为第二条命令执行的参数
|| (又称短路或)表示上条命令执行失败后才会执行第二条命令
2、&与&&的区别
& 不管第一条命令执行是否成功,都执行第二条命令
&& (短路与) 第一条命如果执行失败,则不执行第二条命令
三、grep
1、-A
ifconfig |grep -A 1 "ens33" | tail -1 |awk -f ' ' '{print $2}'
#方便拿网卡ip地址
也可以定义网卡名称,在来过滤ip
a=ens33
ifconfig |grep -A 1 $a | tail -1 |awk -f ' ' '{print $2}'
2、grep "过滤词" 文件名
3、-n #显示行号
-i # 过滤不区分大小写
-r #寻遍当前目录所有子目录
grep -rn "nologin" /etc/ #将/etc/目录下所有含有nologin的都过滤出来并显示行号
四、grep/egrep正则
#egrep使用( | 、 {} 、 +、 ?)这四种特殊字符不需要使用转义字符“\”
#" ^ "
放到外面表示以什么什么开头,如果放到[]里,意味着是[]里的字符的反义、非意
“ . ”与“ ? ”的区别
1、" . "
表示任意一个字符,和前面的字符没有任何关系
(不能为0个字符),例:grep " r..t" /etc/passwd
2、"?"表示前面的字符为0或1个 例:ro?t 可以表示rot rt
" * "星号表示任意字符,以星号前面一个字符为标准,出现0-n次
" .* "表示零个或者多个字符,空行也包含在内
"{ }"大括号,让大括号前面的字符重复括号里面的次数
例:"o{2}" 重复出现2次o
"o{1,3}" 重复出现1-3次o
grep -n "o\{2\}" /etc/passwd #过滤出passwd里o出现2次的内容并显示行号
等同于
gerp -E -n "o{2}" /etc/passwd
等同于
egerp -n "o{2}" /etc/passwd
egrep "(oo){2}" /etc/passwd #过滤oo出现2次的内容
五、sed(
主要用于替换
)
1、打印某行
sed -n
'n'
p filename
#单引号内的n若是数字,表示第几行;若是区间,表示范围
sed -n '2'p /etc/passwd
sed -n '1,3'p /etc/passwd #打印1-3行passwd的内容
sed -n
'/n/'
p filename
#
n若是字符串,要加双斜杠,表示所含该字符串的行 p表示打印
sed -n '2'p /etc/passwd #打印第二行
sed -n '2,5'p /etc/passwd # 打印第二行到第五行
sed -n '25,$'p /etc/passwd #打印第25行到结尾
sed -n '/root/'p /etc/passwd #打印root所在的行
sed -n '/^r/'p /etc/passwd #打印以r开头的内容
#用到嵌套时,单引号在里面,双引号在外面;其他情况单引号、双引号通用
例:"'hello',i am "
sed -r #
加-r有特殊符号不用使用转义字符可以执行
sed
-n '/r*\+t/'p
/etc/passwd
相当于
sed
-nr '/r*+t/'p
/etc/passwd
sed -e
sed -n 'n'Ip filename #p前面加大写的i,表示不区分大小写
sed -n '/root/'Ip /etc/passwd
sed -i '7'd /etc/passwd #-i表示直接替换文本,d表示第几行
sed -i "n" /etc/passwd
#n就是像vim一般模式替换字符进行的操作一样 ,1,$s/root/xin/g
例:
sed -i "1,$s/root/xin/g" /etc/passwd
将第一段和最后一段调换位置
sed -r ‘s/([^:]+):(.*):([^:]+)/\3:\2:\1/’
[^:]+ : 非冒号,一个或多个 1
:(.*): :贪婪匹配,一直匹配到最后一个冒号 2
[^:]+ :非冒号,一个或多个 3
前面用小括号()括起来的,后面用反斜杠\数字去表示
注意:
1、替换内容时,有/,需要用\
head passwd |sed 's/\/sbin\/nologin/123/g'
2、或者使用@、#等替换分隔符
head passwd |sed 's@/sbin/nologin@123@g'
sed 's/[a-zA-Z]//g #把英文字母全部删除,相当于替换为空
9.1 正则介绍_grep上
9.2 grep中
9.3 grep下
9.4/9.5 sed
9.6/9.7 awk
9.8扩展
9.9课堂笔记
9.1 正则介绍_grep上
grep [-cinvABC] 'word' filename
-c 行数
[root@xinlinux-02 ~]#
grep -c "login" /etc/passwd
17
-i 不区分大小写
[root@xinlinux-02 ~]#
grep -n "a" 1.txt
1:aaaaaaaaaa
3:aaaaaaaaaa
[root@xinlinux-02 ~]#
grep -ni "a" 1.txt
1:aaaaaaaaaa
2:AAAAAAAAAAAAAA
3:aaaaaaaaaa
4:AAAAAAAAAA
-n 显示行号
[root@xinlinux-02 ~]#
grep -n "a" 1.txt
1:aaaaaaaaaa
3:aaaaaaaaaa
-v 取反
[root@xinlinux-02 ~]#
grep -v "a" 1.txt
AAAAAAAAAAAAAA
AAAAAAAAAA
-A 后面跟数字,过滤出符合要求的行以及
下面n行
[root@xinlinux-02 ~]#
cat 1.txt
aaaaa
AAAA
AAA
aaaa
123
465
145
[root@xinlinux-02 ~]#
grep -A2 "123" 1.txt
123
465
145
-B 后面跟数字,过滤出符合要求的行以及
上面n行
[root@xinlinux-02 ~]#
grep -B2 "123" 1.txt
AAA
aaaa
123
-C 后面跟数字,过滤出符合要求的行以及
上下各n行
[root@xinlinux-02 ~]#
grep -C2 "123" 1.txt
AAA
aaaa
123
465
145
-r 目录 遍历该目录下所有子目录
[root@xinlinux-02 ~]#
grep "passwd" /etc/
grep: /etc/: 是一个目录
[root@xinlinux-02 ~]#
grep -r "passwd" /etc/
/etc/login.defs:# passwd command) should therefore be configured elsewhere. Refer to
/etc/default/nss:# If set to TRUE, the passwd routines in the NIS NSS module will not
/etc/default/nss:# use the passwd.adjunct.byname tables to fill in the password data
9.2 grep中
###^在外面表示以什么开头,在方括号里面表示否,非得意思
grep -n 'root' /etc/passwd
#/etc/passwd 找含有root的行并显示行号
grep -nv 'nologin' /etc/passwd
#取反,/etc/passwd 找含有不包含nologin的行并显示行号
grep '[0-9]' /etc/inittab
#/etc/inittab里面过滤出带数字的行
grep -v '[0-9]' /etc/inittab
#/etc/inittab里面过滤出不包含数字的行
grep -v '^#' /etc/inittab
#/etc/sos.conf里面过滤出不含注释符#的行
grep -v '^#' /etc/inittab |grep -v '^$' == grep -v '^#
| ^$' /etc/inittab
#/etc/inittab内过滤出非注释行和非空行
grep '^[^a-zA-Z]' test.txt
#过滤出以非字母开头的行
9.3 grep下
egrep为grep的增强版,可以识别特殊字符,不需要用脱义符"\"
grep 'r.o' test.txt
#" . "点表示任意一个字符,过滤出text.txt内含有r( )0的行;()表示任意一个字符
grep 'o*o' test.txt
# " * "代表(可为0)任意个*号前面的那个字符
grep '.*' test.txt
# " .* "表示匹配任意所有字符,包括空行
grep 'o\{2\}' /etc/passwd == egrep 'o{2}' /etc/passwd == grep -E 'o{2}' /etc/passwd
# " { } "花括号表示范围,过滤/etc/passwd内包含2个o的行
egrep 'o+' /etc/passwd
# " + "加号表示+号前字符出现1次或以上,过滤/etc/passwd内出现一次o以上的行
egrep 'oo?' /etc/passwd
# " ? "表示问号前一个字符出现0次或者1次,过滤/etc/passwd内含有oo、o的行
egrep ''root | nonlogin' /etc/passwd
#过滤出/etc/passwd内含有root或者nonogin的行
egrep '(oo){2}' /etc/passwd
#过滤/etc/passwd内出现2次oo的行
9.4/9.5 sed
#sed能实现grep的功能,但是麻烦,也不会显示颜色;
所以sed主要用于替换
#sed也支持正则表达式,包括特殊字符
查找字符串
sed -n '/root/ 'p 1.txt
# ' ' 单引号里面如果是字符串的话需要加上双斜杠//
指定行
sed -n '2'p 1.txt #打印出1.txt的第二行
#' ' 单引号里面如果是数字的话,表示打印指定行
指定范围行
sed -n ' 2,6'p 1.txt #打印出1.txt的第二行到第六行
sed -n ' 2,$'p 1.txt #打印出1.txt的第二行到行尾
sed -n ' 1,$'p 1.txt #打印出1.txt的全文
-e表示在一条命令执行多个操作,相互不会影响
sed -e '1'p -e'/111/'p -n 1.txt
#打印1.txt第一行的同时打印含有字符串111的行
ps:如果多个命令间查找的结果相同,会重复打印出来
sed查找打印不区分大小写
#
在p前面加一个大写的i,
sed -n '/root/ 'Ip 1.txt
#打印1.txt内不区分大小写的root字符串的行
sed删除并打印删除后的内容d
sed '1, 10'd 1.txt
#删除1.txt内第1到10行的内容后打印出来
sed '/root/'d 1.txt #删除所含root字符串所在行后打印出来
sed -r #使特殊字符生效
加-i ,可直接删除查找行内容 (有些危险)
sed -i '1, 10'd 1.txt #删除
sed替换(与vim的替换相似)
sed '1,10s/root/toor/g' 1.txt
#将1.txt第一到十行内全局替换,root换成toor
sed -r '1,10s/ro+/toor/g' 1.txt
1、
替换内容时,有/,需要用\
head passwd |sed 's/\/sbin\/nologin/123/g'
2、
或者使用@、#等替换分隔符
head passwd |sed 's@/sbin/nologin@123@g'
sed 's/[a-zA-Z]//g #把英文字母全部删除,相当于替换为空
将第一段和最后一段调换位置
sed -r ‘s/([^:]+):(.*):([^:]+)/\3:\2:\1/’
([^:]+)
非冒号,一个或多个 1
:(.*):
贪婪匹配,一直匹配到最后一个冒号 2
([^:]+) 非冒号,一个或多个 3
#前面用小括号()括起来的,后面要用反斜杠\数字去表示
\3:\2:\1
将1,2,3分别代表([^:]+) 、:(.*): 、([^:]+),即
\1:\2:\3,调换顺序就是调换位置
9.6/9.7 awk
#支持分段,可以针对段做匹配,支持正则表达式(也支持特殊符号,不需要加脱义字符"/")
#若是不-F指定分隔符,会默认空格或者空字符为分隔符
1、
awk -F ':' '{print $1}' 1.txt
#选取1.txt通过awk用":"冒号分段,取$1第一段内容
awk -F ':' '{print $1,$3,$4}' 1.txt
#取$1、$3、$4第一段、第三段、第四段内容
awk -F ':' '{print $0}' 1.txt
#$0取所有段的内容
awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
#手动添加分隔符
2、awk匹配功能
awk '/oo/' 1.txt
#将含有oo字符串的匹配出来
awk -F ':' '$1~/oo/'1.txt
#将第一段含有oo字符串的匹配出来
3、awk支持多个表达式一起写
awk -F ':' '/root/ {print $1,$3} /user/ {print $3,$4}' 1.txt
#将含有root的行打印第一段和第三段内容,同时将含有user的行打印第三段和第四段内容
4、awk数学运算表达式
awk -F ':' '$3==1000' /etc/passwd
#匹配第三段等于1000的行
awk -F ':' '$3==''1000''' /etc/passwd
#匹配第三段等于通过ascii配对1000获得值的行
#针对数字的不要加双引号,加了双引号系统会通过ASCII码进行匹配
awk -F ':' '$3==1000 {print $1}' /etc/passwd
#匹配第三段等于1000的行列出第一段
awk -F ':' '$7!="/sbin/nologin"' /etc/passwd
#" != "表示不等于; 匹配第七行不等于/sbin/nologin的行
awk字段间比较
awk -F ':' '$3>$4' /wtc/passwd
#匹配第三段大于第四段的行
awk -F ':' '$3==$4' /wtc/passwd
#匹配第三段等于第四段的行
awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
#匹配第三段大于5且小于7的行
awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd
#匹配第三段大于1000或者第七段等于/bin/bash的行
5、OFS内置变量
awk -F ':' '{OFS="#"} 匹配条件 {print $1,$3,$4}' /etc/passwd
#将匹配到的第一、三、四段的内容用"#"号分隔符分隔
#
{OFS="#"},OFS:内置变量,表示指定print时用到的分隔符
#两个花括号之间写匹配的条件
awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$3,$4}}' /etc/passwd
#匹配第三段内容大于1000的行,将第一、第三、第四段输出并用"#"号隔开
6、内置变量NF(段数)、NR(行号)
awk -F ':' '{print NF}'
#将段数显示出来
awk -F ':' '{print NF":"$0}' /etc/passwd
#将所有段的段数显示出来
awk -F ':' '{print NR}'
#将行号显示出来
awk -F ':' '{print NR":"$0}' /etc/passwd
#将所有段的行号显示出来
awk 'NR>40' /etc/passwd
#把从第41行开始的行显示出来
awk -F ':' 'NR<20 && $1~/roo/' /etc/passwd
#把行号小于20行且第一段为roo的匹配出来
awk -F ':' '{print $NR":"$NF}' /etc/passwd
#passwd一共只有7段, 所以$NF=$7;$NR则是从$1开始一直下去
7、赋值"="号,赋值后分隔符会消失
head -n3 /etc/passwd |awk -F ':' '$1="root" '
#将passwd的第一段内容赋值为root
head -n3 /etc/passwd |awk -F ':' {OFS=":"} '$1="root" '
#将赋值后的内容定义分隔符为":"冒号
awk -F ':' '{if ($1="root") {print $0}}' /etc/passwd
#将passwd的第一段内容赋值为root,然后输出所有段
8、"=="等于号
head -n3 /etc/passwd |awk -F ':' '$1=="root" '
#匹配第一段为root的内容
9、求和第三段所有列的和 (tot表示求和,默认从0开始)
awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd
#
{(tot=tot+$3)}
:tot值表示每次循环都会把第三段的值相加,即第一行的第三段加第二行的第三段,一直循环加下去,就是求和第三段所有列的和
9.8扩展
把一个目录下,过滤所有*.php文档中含有eval的行
grep -r --include="*.php" 'eval' /data/
把这里面的所有练习题做一下
9.9课堂笔记