9.6 awk(上)
1. 创建awk目录做测试:
[root@hao-01 ~]# mkdir awk
2. 进入awk目录下:
[root@hao-01 ~]# cd awk
3. 拷贝/etc/passwd到当前目录并重命名为test.txt :
[root@hao-01 ~]# cp /etc/passwd test.txt
1. 打印 所有段($0)所有内容:
awk '{print 所有段}' 文件名
[root@hao-01 awk]# awk '{print $0}' test.txt
2. 打印 以:(冒号)为分隔符, 每行第一段($1):
awk -F '冒号分割符' '{print 第一段}' 文件名
[root@hao-01 awk]# awk -F ':' '{print $1}' test.txt
3. 打印 以:(冒号)为分隔符, 每行指定段(多个段):
awk -F '冒号分割符' '{print 第一段,第二段,第三段}' 文件名
[root@hao-01 awk]# awk -F ':' '{print $1,$2,$3}' test.txt
4. 打印 以:(冒号)为分隔符, 每行指定段(多个段),打印内容用#号隔开:
awk -F ':' '{print 第一段"井号"第二段"井号"第三段}' 文件名
[root@hao-01 awk]# awk -F ':' '{print $1"#"$2"#"$3}' test.txt
5. 打印 匹配包含oo的行:
awk '/匹配关键词/' 文件名
[root@hao-01 awk]# awk '/oo/' test.txt
6. 匹配出 以:(冒号)为分隔符, 第一段中包含oo的行:
awk -F '冒号分隔符' '指定段 ~ /匹配关键词/' 文件名
[root@hao-01 awk]# awk -F ':' '$1 ~ /oo/' test.txt
7. 匹配出 以:(冒号)为分隔符,第一段中包含oo+的行(支持正则表达式):
awk -F '冒号分隔符' '$1 ~ /匹配关键词+/' 文件名
[root@hao-01 awk]# awk -F ':' '$1 ~ /oo+/' test.txt
8. 匹配出 包含root的行,并打印出此行第一段和第四段;
包含user的行,并打印出此行第二段和第三段 :
awk -F '冒号分隔符' '/匹配关键词/{print 指定段,指定段} /匹配关键词/ {print 指定段,指定段}' 文件名
[root@hao-01 awk]# awk -F ':' '/root/{print $1,$4} /user/ {print $2,$3}' test.txt
匹配数字 :数字不加双引号!!!(字符串非数字需要双引号)
>=100 大于等于100
<=100 小于等于100
=100 等于100
!=100 不等于100
9. 以:(冒号)为分隔符,匹配出第三段大于等于1000的行并打印出第一段
( 需求是匹配数字,数字不要用双引号!)
awk -F '指定分隔符' '指定段>=匹配数字 {print 指定打印段}' 文件名
[root@hao-01 awk]# awk -F ':' '$3>=1000 {print $1}' test.txt
10. 以:(冒号)为分隔符,匹配出第三段小于等于1000的行并打印出全部段
awk -F '指定分隔符' '指定段<=匹配数字 {print 指定打印段}' 文件名
[root@hao-01 awk]# awk -F ':' '$3<=1000 {print $0}' test.txt
11. 以:(冒号)为分隔符,匹配出第一段不等于关键词hao的行并打印出全部段
( 匹配是非数字的字符串,要用双引号引起来! != 表示不等于)
awk -F '指定分隔符' '指定段!="匹配的字符串"{print 指定打印段}' 文件名
[root@hao-01 awk]# awk -F ':' '$1!="hao"{print $0}' test.txt
9.7 awk(下)
1. 以:(冒号)为分隔符,筛选出第三段数字值小于第四段数字值的行:
(注意 "这里的"数值"不代表数字组合)
awk -F '指定分隔符' '第三段数值<第四段数值' 文件名
[root@hao-01 awk]# awk -F ':' '$3<$4' test.txt
2. 以:(冒号)为分隔符,筛选出第三段数值等于第四段数值的行:
(注意 "这里的"数值"不代表数字组合)
awk -F '指定分隔符' '第三段数值==第四段数值' 文件名
[root@hao-01 awk]# awk -F ':' '$3==$4' test.txt
3. 以:(冒号)为分隔符,筛选出第三段数值大于5 &&(并且)小于7 :
(注意 "这里的"数值"不代表数字组合)
awk -F ':' '第三段数值>"5" && 第三段数值<"7"' 文件名
[root@hao-01 awk]# awk -F ':' '$3>"5" && $3<"7"' test.txt
4. 以:(冒号)为分隔符,筛选出第三段数字大于1000 ||(或者) 第七段数字大于等于/sbin/nologin :
awk -F '指定分隔符' '第三段>指定数字 || 第七段=="指定字符串"' 文件名
[root@hao-01 awk]# awk -F ':' '$3>1000 || $7=="/sbin/nologin"' test.txt
5. 以:(冒号)为分隔符,筛选出第三段数字大于1000 ||(或者) 第七段匹配关键词nologin的行
awk -F ':' '第三段>指定数字 || 第七段 ~ /匹配关键词/' 文件名
[root@hao-01 awk]# awk -F ':' '$3>1000 || $7 ~ /nologin/' test.txt
6. 以:(冒号)为分隔符,筛选出第三段数字大于1000 ||(或者)第七段匹配关键词nologin的行打印出第一段,第三段,第七段以#号隔开!
awk -F '指定分隔符' '{OFS="指定打印分隔符"} 第三段>指定数字 || 第7段 ~ /匹配关键词/ {print 打印第一段,打印第三段,打印第七段}' 文件名
[root@hao-01 awk]# awk -F ':' '{OFS="#"} $3>1000 || $7 ~ /nologin/ {print $1,$3,$7}' test.txt
7. 以:(冒号)为分隔符,筛选出第三段数字大于1000的行第一段,第二段,第三段,第四段以#号隔开!
[root@hao-01 awk]# awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' test.txt
8. 打印显示行号:
[root@hao-01 awk]# awk -F ':' '{print NR":"$0}' test.txt
9. 以:(冒号)为分隔符,匹配出每行共有多少行段 :
[root@hao-01 awk]# awk -F ':' '{print NF":"$0}' test.txt
10. 打印出1到10行:
[root@hao-01 awk]# awk -F ':' 'NR<10' test.txt
11. 以:(冒号)为分隔符,筛选前10行&&(并且)第一段含有root或者sync关键词的行:awk -F ':' 'NR<10&& 第一段 ~ /匹配关键词|匹配关键词/' 文件名
[root@hao-01 awk]# awk -F ':' 'NR<10 && $1 ~ /root|sync/' test.txt
12. 以:(冒号)为分隔符,匹配前六行 &&(并且)第一段含有root或者sync关键词的行:awk -F ':' 'NF==6&& 第一段 ~ /匹配关键词|匹配关键词/' test.txt
[root@hao-01 awk]# awk -F ':' 'NF==6 && $1 ~ /root|sync/' test.txt
13. 前三行输出结果,awk执行,以冒号分割符号,复值了每行第一段都是root,并把打印出的结果以冒号隔开
[root@hao-01 awk]# head -n 3 test.txt |awk -F ':' '{OFS=":"} $1="root"'
14. 打印行段 不用冒号分割,默认是空格隔开每段:
[root@hao-01 awk]# head -n 3 test.txt |awk -F ':' '$1="root"'15. 以:(冒号)为分隔符,设想hao等同于全部行第三段值的总和 :
[root@hao-01 awk]# awk -F ':' '{(hao=hao+$3)}; END {print hao}' test.txt
练习题: