标签:etc font $0 双引号 pass lib ges boa bash
9.6/9.7 awk
awk
-F 指定分隔符
'{print $1}' 打印第一段 ($0表示所有段)
[root@localhost awk]# awk -F : '{print $1}' test.txt ##-F指定 : 为分隔符,把第一段打印
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
postfix
sshd
chrony
[root@localhost awk]# head -2 test.txt | awk '{print $0}' ## {print $0} 打印全部
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin创建一个新文件,1,.txt,内容如下:
[root@localhost awk]# cat 1.txt
1 2
aa bb
dd ee
[root@localhost awk]# awk '{print $1}' 1.txt ##不指定分隔符,默认用 空格 作为分隔符
1
aa
dd
[root@localhost awk]# awk -F : '{print $1,$3,$4}' test.txt ##多打印几列
root 0 0
bin 1 1
daemon 2 2
adm 3 4
lp 4 7
sync 5 0
shutdown 6 0
halt 7 0
mail 8 12
operator 11 0
games 12 100
ftp 14 50
nobody 99 99
systemd-network 192 192
dbus 81 81
polkitd 999 997
postfix 89 89
sshd 74 74
chrony 998 996·指定分隔的结果,用#隔开
[root@localhost awk]# awk -F : '{print $1"#"$3"#"$4}' test.txt
root#0#0
bin#1#1
daemon#2#2
adm#3#4
lp#4#7
sync#5#0
shutdown#6#0
halt#7#0
mail#8#12
operator#11#0
games#12#100
ftp#14#50
nobody#99#99
systemd-network#192#192
dbus#81#81
polkitd#999#997
postfix#89#89
sshd#74#74
chrony#998#996·awk的匹配:(awk不用加脱义字符)
★匹配包含oo的行
[root@localhost awk]# awk '/oo/' test.txt root:x:0:0:root:/root:/bin/bash lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin
★ 精确匹配,第一段匹配字符 oo 的行
[root@localhost awk]# awk -F : '$1 ~ /oo/' test.txt ## 精确匹配 root:x:0:0:root:/root:/bin/bash
★精确匹配第一段有1个或多个o的行
[root@localhost awk]# awk -F : '$1 ~ /o+/' test.txt root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown operator:x:11:0:operator:/root:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin
★test.txt中,以:分段,匹配root的行中,打印该行1和3段,匹配user的行中打印该行3和4段
[root@localhost awk]# awk -F : '/root/{print $1,$3} /user/{print $3,$4}' test.txt
root 0
operator 11★匹配root或user的行:
[root@localhost awk]# awk -F: '/root|user/' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost awk]# awk -F: '/root|user/{print $0}' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin★第三段等于0的行
[root@localhost awk]# awk -F: '$3=="0"' test.txt
root:x:0:0:root:/root:/bin/bash
[root@localhost awk]# awk -F: '$3==0 {print $1}' test.txt ##第三段等于0的行的第一段
root★第三段大于等于900的行
[root@localhost awk]# awk -F: '$3>=900 {print $0}' test.txt
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin★★★★★如果给数字加上双引号,那么会将900当做字符,会以ASCII来排序,而不是数字排序,因此结果中多了99的行
[root@localhost awk]# awk -F: '$3>="900" {print $0}' test.txt
nobody:x:99:99:Nobody:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin★第7段不是/sbin/nologin的行 (!= 不等于)
[root@localhost awk]# awk -F: '$7!="/sbin/nologin"' test.txt root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt

两个字段比大小
[root@localhost awk]# awk -F : '$3<$4' test.txt ##第三段比第四段小的行 adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin [root@localhost awk]# awk -F : '$3==$4' test.txt ##第三段和第四段相等行 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin [root@localhost awk]# awk -F : '$3>"5" && $3<"7"' test.txt ##5和7是字符,不是数字 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
或者
[root@localhost awk]# awk -F : '$3>1000|| $7=="/sbin/nologin"' test.txt ##因为是字符所以加“ ” bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin [root@localhost awk]# awk -F : '$3>1000 || $7 ~ /bash/' test.txt ## ~ 匹配 root:x:0:0:root:/root:/bin/bash
·内置变量 OFS:
指定打印时的分隔符:{OFS=' '} 要在print前使用
-指定目前的分隔符;OFS指定要改为什么分隔符;条件(不写条件就是全部);打印的段
[root@localhost awk]# head -5 /etc/passwd |awk -F : '{OFS="#"}{print $1,$3,$4}' ## #号必须加“”
root#0#0
bin#1#1
daemon#2#2
adm#3#4
lp#4#7
[root@localhost awk]# awk -F : '{OFS="#"} {if ($3>"5") {print $1,$2,$3,$4}}' /etc/passwd
shutdown#x#6#0
halt#x#7#0
mail#x#8#12
nobody#x#99#99
dbus#x#81#81
polkitd#x#999#997
postfix#x#89#89
sshd#x#74#74
chrony#x#998#996NR:表示行号
[root@localhost awk]# awk -F : '{print NR":"$0}' test.txt ##类似于grep -n
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11:games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13:nobody:x:99:99:Nobody:/:/sbin/nologin
14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15:dbus:x:81:81:System message bus:/:/sbin/nologin
16:polkitd:x:999:997:User for polkitd:/:/sbin/nologin
17:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
18:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologinRF:表示段号
[root@localhost awk]# awk -F : '{print NF":"$0}' test.txt ##显示每行有多少段
7:root:x:0:0:root:/root:/bin/bash
7:bin:x:1:1:bin:/bin:/sbin/nologin
7:daemon:x:2:2:daemon:/sbin:/sbin/nologin
7:adm:x:3:4:adm:/var/adm:/sbin/nologin
7:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
7:halt:x:7:0:halt:/sbin:/sbin/halt
7:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
7:operator:x:11:0:operator:/root:/sbin/nologin
7:games:x:12:100:games:/usr/games:/sbin/nologin
7:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
7:nobody:x:99:99:Nobody:/:/sbin/nologin
7:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
7:dbus:x:81:81:System message bus:/:/sbin/nologin
7:polkitd:x:999:997:User for polkitd:/:/sbin/nologin
7:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
7:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
7:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@localhost awk]# awk 'NR<=10 ' test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
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
operator:x:11:0:operator:/root:/sbin/nologin前十行,第一段是root或者sync的行:
[root@localhost awk]# awk -F : 'NR<=10 && $1 ~ /root|sync/' test.txt root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync [root@localhost awk]# awk 'NR<=10 && $1 ~ /root|sync/' test.txt ##如果不加-F,会把整行当做$! root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync operator:x:11:0:operator:/root:/sbin/nologin
·一个 = 是赋值,而 == 才表示是等于
[root@localhost awk]# head -3 test.txt |awk -F : '$1="root"' ##把第一段全部改为root
root x 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
[root@localhost awk]# head -3 test.txt |awk -F : '$1=="root"' ##这才是打印第一段为root的行
root:x:0:0:root:/root:/bin/bash
[root@localhost awk]# head -3 test.txt |awk -F : '{OFS=":"} $1=="root"' ##可以OFS 定义分隔符
root:x:0:0:root:/root:/bin/bash求和tot
[root@localhost awk]# awk -F : '{tot=tot+$3};END {print tot}' test.txt
2605(tot=tot+$3,求和,从第一行0开始,加上$3的值,到第二行,第一行$3加上第二行$3,以此类推,最后打印出总和)
判断:
[root@localhost awk]# awk -F : '{if ($1=="root"){print $0}}' test.txt
root:x:0:0:root:/root:/bin/bash(如果第一段是root,那么打出所有行。就是打印第一段为root的行)
标签:etc font $0 双引号 pass lib ges boa bash
原文地址:http://blog.51cto.com/11530642/2062201