2018-1-17 6周3次课 awk
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018-1-17 6周3次课 awk相关的知识,希望对你有一定的参考价值。
9.6/9.7 awk
awk
-F 指定分隔符
'{print $1}' 打印第一段 ($0表示所有段)
[[email protected] 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 [[email protected] 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,内容如下:
[[email protected] awk]# cat 1.txt 1 2 aa bb dd ee [[email protected] awk]# awk '{print $1}' 1.txt ##不指定分隔符,默认用 空格 作为分隔符 1 aa dd [[email protected] 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
·指定分隔的结果,用#隔开
[[email protected] 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的行
[[email protected] 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 的行
[[email protected] awk]# awk -F : '$1 ~ /oo/' test.txt ## 精确匹配 root:x:0:0:root:/root:/bin/bash
★精确匹配第一段有1个或多个o的行
[[email protected] 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段
[[email protected] awk]# awk -F : '/root/{print $1,$3} /user/{print $3,$4}' test.txt root 0 operator 11
★匹配root或user的行:
[[email protected] awk]# awk -F: '/root|user/' test.txt root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [[email protected] 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的行
[[email protected] awk]# awk -F: '$3=="0"' test.txt root:x:0:0:root:/root:/bin/bash [[email protected] awk]# awk -F: '$3==0 {print $1}' test.txt ##第三段等于0的行的第一段 root
★第三段大于等于900的行
[[email protected] 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的行
[[email protected] 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的行 (!= 不等于)
[[email protected] 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
两个字段比大小
[[email protected] 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 [[email protected] 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 [[email protected] awk]# awk -F : '$3>"5" && $3<"7"' test.txt ##5和7是字符,不是数字 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
或者
[[email protected] 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 [[email protected] awk]# awk -F : '$3>1000 || $7 ~ /bash/' test.txt ## ~ 匹配 root:x:0:0:root:/root:/bin/bash
·内置变量 OFS:
指定打印时的分隔符:{OFS=' '} 要在print前使用
-指定目前的分隔符;OFS指定要改为什么分隔符;条件(不写条件就是全部);打印的段
[[email protected] 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 [[email protected] 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#996
NR:表示行号
[[email protected] 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/nologin
RF:表示段号
[[email protected] 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 [[email protected] 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的行:
[[email protected] 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 [[email protected] 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
·一个 = 是赋值,而 == 才表示是等于
[[email protected] 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 [[email protected] awk]# head -3 test.txt |awk -F : '$1=="root"' ##这才是打印第一段为root的行 root:x:0:0:root:/root:/bin/bash [[email protected] awk]# head -3 test.txt |awk -F : '{OFS=":"} $1=="root"' ##可以OFS 定义分隔符 root:x:0:0:root:/root:/bin/bash
求和tot
[[email protected] awk]# awk -F : '{tot=tot+$3};END {print tot}' test.txt 2605
(tot=tot+$3,求和,从第一行0开始,加上$3的值,到第二行,第一行$3加上第二行$3,以此类推,最后打印出总和)
判断:
[[email protected] awk]# awk -F : '{if ($1=="root"){print $0}}' test.txt root:x:0:0:root:/root:/bin/bash
(如果第一段是root,那么打出所有行。就是打印第一段为root的行)
以上是关于2018-1-17 6周3次课 awk的主要内容,如果未能解决你的问题,请参考以下文章