本文共 6718 字,大约阅读时间需要 22 分钟。
awk和sed一样是流式编辑器,它也是针对文档中的行来操作的,一行一行的去执行
head -n2 test.txt|awk -F ':' '{print $1}' //截取文档的第一段
head -n2 test.txt|awk -F ':' '{print $0}' //截取文档前两行
awk '{print $0}' test.txt //不指定分隔符默认使用空格或者tab空白字符
awk -F ':' '{print $1,$2,$3}' test.txt //分别截取第一、第二、第三段
awk -F ':' '{print $1"#"$2"#"$3"#"$4}' //分别截取第一到第四段#隔开
awk '/oo/' test.txt //匹配含有oo字符的行
awk -F ':' '$1 ~/oo/' test.txt //表示让第一段匹配到oo的行
awk -F ':' '$1~/o+/' test.txt //表示第一段匹配到至少一个o或者多个的行
awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt //匹配含有root行输出第一和第三段,匹配test的行输出第一和第三段
awk -F ':' '$3=="0"' /etc/passwd
awk -F ':' '$3>="500"' /etc/passwd //第三段大于等于500的(500被认为一个字符串)
awk -F ':' '$3>=500' /etc/passwd //第三段大于等于500的。数字不要加双引号(加双引号会被认为是一个字符串)。
awk -F ':' '$7!="/sbin/nologin"' /etc/passwd //第七段不是/sbin/nologin字符串(要加双引号)
user2
user6
lsx
lsx2
[root@lsx-02 awk]# awk -F ':' '{print $1}' passwd 打印第一段 所有段(整行)用0表示 不指定分隔符默认以空格分开
user6 x 1001 1001
lsx x 1011 1011
lsx2 x 1012 1012
[root@lsx-02 awk]# awk -F ':' '{print $1,$2,$3,$4}' passwd
user6#x#1001#1001
lsx#x#1011#1011
lsx2#x#1012#1012
[root@lsx-02 awk]# awk -F ':' '{print $1"#"$2"#"$3"#"$4}' passwd 以什么连接“”引起来
[root@lsx-02 awk]# awk -F ':' '$1 ~/oo/' passwd 匹配把第一段含有oo的字符打印出来
root:x:0:0:root:/root:/bin/bash
rooooaiperator:x:11:0:operator:/rcot:/sbin/nologin
[root@lsx-02 awk]# awk -F ':' '$1 ~/o+/' passwd 优势于grep sed
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@lsx-02 awk]# sed -n '/oo/p' passwd 类似于awk同上
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@lsx-02 awk]# awk -F ':' '/root/ {print$1,$5} /bus/ {print $2,$3}' passwd
root root
x 81
[root@lsx-02 awk]# egrep 'root|bus' passwd egrep
root:x:0:0:root:/root:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin
[root@lsx-02 awk]# awk '/root|bus/' passwd 同上
root:x:0:0:root:/root:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin
user6:x:1001:1001::/home/user11:/bin/bash
lsx:x:1011:1011::/home/lsx:/bin/bash
lsx2:x:1012:1012::/home/lsx2:/bin/bash
[root@lsx-02 awk]# awk -F ':' '$3>="1000"' passwd 不是针对数字的不要加双引号,加双引号是按Asicc码
[root@lsx-02 awk]# awk -F ':' '$7!="/sbin/nologin"' passwd 字符串要双引号括起来
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/SBin/nologin
awk -F ':' '$3<$4' /etc/passwd //第三段小于第四段
awk -F ':' '$3>"5" && $3<"7"' /etc/passwd 第三段字符大于5并且第三段字符小于7
awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd //第三段大于100或者第七段等于..
awk -F ':' '$3>100 || $1~/root/' test.txt //匹配
head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}‘
awk -F ':' '{OFS="@"} $3>10 || $1=="root" {print $1,$2,$3}' test.txt //OFS在print打印指定用什么符号作为分隔符 OFS和print顺序改变会影响结果。两个大括号之间设置条件
root@x@0
operator@x@11
awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd
awk -F ':' '{OFS="!"} $1~/root/ {print $1,$2,$3}' test.txt
root!x!0
awk -F ':' '{OFS="!"} {if ($1~/root/) {print $1,$2,$3}}' test.txt //这种便于理解
root!x!0
head -n3 /etc/passwd | awk -F ':' '{print NF}‘
awk -F ':' '{print NF}' test.txt //以冒号为分隔符,输出一共多少段。-NF
7
7
7
head -n3 /etc/passwd | awk -F ':' '{print NR}‘
awk -F ':' '{print NR":"$0}' test.txt //输出一共多少行
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
awk 'NR>40' /etc/passwd
awk 'NR<=10' test.txt //打印1到10行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd
awk 'NR<=10 && $1 ~ /root|sync/' test.txt //匹配小于等于10行并且第一段包含root或者sync字符
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
operator:x:11:0:operator:/root:/sbin/nologin
head -n 3 /etc/passwd |awk -F ':' '$1="root"‘
awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd
awk -F ':' '{if ($1=="root") {print $0}}' /etc/passwd
[root@lsx-02 awk]# awk -F ':' '$3>"5" && $3<"7"' passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@lsx-02 awk]# awk -F ':' '$3>1000 || $7~/bash/' passwd
root:x:0:0:root:/root:/bin/bash
user1:x:1006:1001::/home/lsx3:/sbin/nologin
lsx6:x:1009:1009::/home/lsx6:/bin/bash
user2:x:1010:1010::/home/user2:/bin/bash
user6:x:1001:1001::/home/user11:/bin/bash
[root@lsx-02 awk]# awk -F ':' '{OFS="#"} $3>1000 || $7~/bash/ {print$1,$2,$3}' passwd OFS print打印指定分割符号
root#x#0
user1#x#1006
lsx6#x#1009
[root@lsx-02 awk]# awk -F ':' '{OFS="#"} {if($3>1000){print$1,$2,$3}}' passwd
user1#x#1006
lsx6#x#1009
user2#x#1010
25user2:x:1010:1010::/home/user2:/bin/bash
26user6:x:1001:1001::/home/user11:/bin/bash
27lsx:x:1011:1011::/home/lsx:/bin/bash
28lsx2:x:1012:1012::/home/lsx2:/bin/bash
[root@lsx-02 awk]# awk -F ':' '{print NR$0}' passwd NR显示所有的行号
NF :用分隔符分隔后一共有多少段
NR :行数
awk -F ':' '{print $NF}' test.txt //$NF 表示最后一段的值
/bin/bash
/sbin/nologin
7user2:x:1010:1010::/home/user2:/bin/bash
7user6:x:1001:1001::/home/user11:/bin/bash
7lsx:x:1011:1011::/home/lsx:/bin/bash
7lsx2:x:1012:1012::/home/lsx2:/bin/bash
[root@lsx-02 awk]# awk -F ':' '{print NF$0}' passwd NR打印有几段
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@lsx-02 awk]# sed -n '1,10p' passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@lsx-02 awk]# awk -F ':' 'NR<=10' passwd 同上 打印前10行
[root@lsx-02 awk]# awk -F ':' 'NR<=10 && $1~/root|sync/' passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
[root@lsx-02 awk]# awk -F ':' '{print $NR":"$NF}' passwd 1-7 30-7
root:/bin/bash
x:/sbin/nologin
2:/sbin/nologin
4:/sbin/nologin
lp:/sbin/nologin
/sbin:/bin/sync
/sbin/shutdown:/sbin/shutdown
:/sbin/halt
[root@lsx-02 awk]# sed -n '3,4p' passwd | awk -F ':' '$1="root"' =赋值
root
root x 2 2 daemon /sbin /sbin/nologin
awk -F ':' '{OFS="@"} $1="root"' test.txt //OFS
root@x@0@0@root@/root@/bin/bash
[root@lsx-02 awk]# awk -F ':' '{ {tot=tot+$3}}; END {print tot}' passwd 值相加
7704
[root@lsx-02 awk]# awk -F ':' '{tot=tot+$4};END{print tot}' passwd
7801
[root@lsxlinux02 awk]# grep -E 'root|User' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
[root@lsxlinux02 awk]# sed -nr '/root|User/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
[root@lsxlinux02 awk]# awk '/root|User/ {print $0}' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
df -h|awk 'NR==2 {print $5}'
10%
小结:sed擅长输出行,awk擅长列
本文转自 虾米的春天 51CTO博客,原文链接:http://blog.51cto.com/lsxme/1984094,如需转载请自行联系原作者