9.6/9.7awk命令
awk是一种编程语言工具 可以通过分段 算数和判断等方式来匹配内容 还内涵数组,函数等等 默认支持扩展正则
用法:awk [-F 分隔符号] '内容' 文件名
-F
:指定分隔符号 不写默认空格为分隔符号
打印功能
1 | [root@localhost test]# awk -F ':' '{print $1}' 1.txt ##{print $1}为打印第一段 |
1 | [root@localhost test]# awk -F ':' '{print $0}' 1.txt ##$0表示整一行 |
显示多段用,分开1
2
3
4[root@localhost test]# awk -F ':' '{print $1,$4}' 1.txt ##打印第一段和第四段
root 0
bin 1
daemon 2
我们也可以用#来显示打印的分隔符号1
2
3
4[root@localhost test]# awk -F ':' '{print $1"#"$2"#"$5}' 1.txt ##"#"为显示#这个字符
root#x#root
bin#x#bin
daemon#x#daemon
匹配功能
匹配出有oo的行1
2
3
4[root@localhost test]# awk '/oo/' 1.txt ##匹配带有oo的行 类似sed的匹配
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
以某段来匹配1
2[root@localhost test]# awk -F ':' '$1 ~ /oo/' 1.txt ##~表示含有 第一段含有oo的行
root:x:0:0:root:/root:/bin/bash
还支持多次匹配1
2
3
4
5[root@localhost test]# awk -F':' '/root/ {print $1,$3} /kun/ {print $1,$7}' 1.txt
root 0
kun1 /bin/bash
kun2 /bin/bash
kun05 /bin/bash
比较功能
==
为等于1
2[root@localhost test]# awk -F':' '$3==0' 1.txt ##第三段等于0的行
root:x:0:0:root:/root:/bin/bash
1 | [root@localhost test]# awk -F':' '$3>=500' 1.txt ##第三段大于等于500的行 |
""
表示字符串 字符串比较用ascii码比较 500字符用第一位5来比较大小1
2
3
4
5
6
7
8
9
10
11
12[root@localhost test]# awk -F':' '$3>="500"' 1.txt 第三段大于等于500这个字符串的行
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
nobody:x:99:99:Nobody:/:/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
kun1:x:8888:1001::/home/kun1/:/bin/bash
111:x:8889:8889::/home/111:/bin/bash
kun3:x:8890:8890::/home/kun3:/bin/bash
!=
为不低于1
2
3
4
5[root@localhost test]# awk -F':' '$7!="/sbin/nologin"' 1.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
比较两个段1
2
3
4[root@localhost test]# awk -F':' '$3<$4' 1.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
&&
为并且1
2[root@localhost test]# awk -F':' '$3>"5" && $3<"7"' 1.txt ##第三段大于5并且小于7的字符串的行
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
||
为或者1
2
3
4[root@localhost test]# awk -F':' '$3>1000 || $1 ~ /oo/' 1.txt ##第三段大于1000或者第一段含有oo的行
root:x:0:0:root:/root:/bin/bash
kun1:x:8888:1001::/home/kun1/:/bin/bash
kun2:x:1001:1001::/home/kun2:/bin/bash
内置变量
变量名 | 含义 |
---|---|
OFS | 指定显示屏幕的分隔符号 |
NF | 段数 |
NR | 行数 |
OFS指定@为显示的分隔符号
1 | [root@localhost test]# awk -F':' '{OFS="@"} {print $1,$2}' 1.txt |
嵌套if语言来表示匹配的条件1
2
3
4[root@localhost test]# awk -F':' '{OFS="@"} {if ($3>1000) {print $1,$7}}' 1.txt
kun1@/bin/bash
kun2@/bin/bash
kun05@/bin/bash
等同于1
2
3
4[root@localhost test]# awk -F':' '{OFS="@"} $3>1000 {print $1,$7}' 1.txt
kun1@/bin/bash
kun2@/bin/bash
kun05@/bin/bash
NR显示行号
1 | [root@localhost test]# awk -F':' '{print NR":"$0}' 1.txt ##每行开头加上 行数: |
NF显示段数
1 | [root@localhost test]# awk -F':' '{print NF":"$0}' 1.txt |
NR NF可以作为判断条件1
2
3
4
5
6
7
8
9
10[root@localhost test]# awk -F':' 'NR<10 {print NR":"$0}' 1.txt ##打印前十行
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
也可以和&& ||来作比较1
2
3[root@localhost test]# awk -F':' 'NR<=10 && $1 ~/root|adm/ {print $0}' 1.txt ##行号小于大于10并且第一段root或者adm的行
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
1 | [root@localhost test]# awk -F':' '{print $NR":"$NF}' 1.txt ##理解为第一行$1:$7 第二行$2:$7... |
赋值功能
1 | [root@localhost test]# awk -F':' '$1="root"' 1.txt ##把root赋值给第一段 |
循环功能
1 | [root@localhost test]# awk -F':' '{(a=a+$3)};END {print a}' 1.txt ##求和第三段的和 |
判断功能
1 | [root@localhost test]# awk -F':' '{if($1=="root") {print $0}}' 1.txt ##如果第一段大于root 那么大于那行 |
awk中正则用法
awk -F ‘:’ ‘$1 ~ /o+/‘ 1.txt 匹配第一段含有o oo …的行
1 | [root@localhost test]# awk -F ':' '$1 ~ /o+/' 1.txt |
awk -F’:’ ‘/root|kun/ {print $1,$7}’ 1.txt 匹配出root和kun行并且打印出改行的第一段和第七段
1 | [root@localhost test]# awk -F':' '/root|kun/ {print $1,$7}' 1.txt |
awk命令调用外部变量
1)awk命令使用单引号情况,使用
"'$var'"
应用,双引号+单引号+变量+单引号+双引号
格式
1 | $ a=test |
2)awk命令使用单引号情况,且变量中有空格 使用
"'"$var"'"
应用,双引号+单引号+双引号+变量+双引号+单引号+双引号
格式
1 | $ a="This is test" |
3)使用
export
设置环境变量,在awk中使用ENVIRON["var"]
1 | $ a="This is test";export a |
4)使用
awk -v
选项,适用于变量不多情况
1 | $ a="This is test" |
awk命令连接字符串
1)awk字符串转为数字并相加起来,使用
+
符号,非数字开头变为0,数字开头转为该数字,后面忽略
1 | $ awk 'BEGIN{a="aa1";b="50aaa";print(a+b+1)}' # 值为51 a=0 b=50 再相加 |
2)awk数字转为字符串并拼接起来,使用
""
符号 可以在""
符号中间加字符表示拼接该字符
1 | $ awk 'BEGIN{a=100;b=100;c=(a""b);print(c"a")}' # 值为100100a c为100100 再和"a"字符拼接 |
统计机器的网络连接状态
1 | $ netstat -an|awk '/^tcp/ {++A[$NF]} END {for (i in A) print i,A[i]}' |
/^tcp/
匹配开头是tcp的行++A[$NF]
A
表示数组 $NF
是字符LISTEN等 也就是数组A的中的key ++
是数值+1 ++A[$NF]
是叠加数组中key对应valuefor (i in A) print i,A[i]
遍历数组A 打印出key和对应的value
查看文章 查看文章1
匹配第一个等号后面的所有字符
1 | $ echo 'KEY=sdfii3243==!S/.'|awk -F '=' '{s="";for(i=2;i<=NF;i++) s=s""(i==NF?$i:$i"=");print s}' |
s=""
定义字符串变量s,值为空,可以不提前设置for(i=2;i<=NF;i++)
由于不需要等号左边的值,所以从第二端开始匹配s=s""(i==NF?$i:$i"=")
根据段数i是否等于NF,其值为$i或$i与=拼接出的字符,再与之前的变量s拼接出新变量s