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的主要内容,如果未能解决你的问题,请参考以下文章

2018.1.17 6周3次课

2018.1.16 6周2次课

2018.3.6 11周1次课

2018-3-6 11周1次课

2018-3-6 10周5次课 配置防盗链访问控制DirectoryFilesMatch

2018.4.20 17周3次课