Focusshell
他日若遂凌云志,敢笑黄巢不丈夫;
FRIENDS
BabyLego

Day-2-Awk命令下部

2018/08/28 Linux三剑客命令

Awk命令下部分

条件表达式:
== != > >=

1
2
3
4
5
6
7
awk -F":" "$1=="mysql"{print $3}" /etc/passwd
awk -F":" '{if($1=="docker") print $3}' /etc/passwd # 与上面相同
awk -F":" '$1!="mysql" {print $3}' /etc/passwd # 不等于
awk -F":" '$3>1000{print $3}' /etc/passwd # 大于
awk -F":" '$3>=100{print $3}' /etc/passwd # 大于等于
awk -F":" '$3<1{print $3}' /etc/passwd # 小于
awk -F":" '$3<=1{print $3}' /etc/passwd # 小于等于

逻辑运算符
&& ||

1
2
3
4
awk -F: '$1~/daocker/ && $3>8{print }' /etc/passwd  # 逻辑与,$1匹配docker,并且$3>8
awk -F: '{if($1~/docker/ && $3>8)print }' /etc/passwd
awk -F: '$1~/docker/ || $3>1000 {print }' /etc/passwd # 逻辑或
awk -F: '{if($1~/docker/ || $3>1000) print }' /etc/passwd

数值运算

1
2
3
4
5
6
7
8
awk -F: '$3 > 100' /etc/passwd 
awk -F: '$3 > 100 || $3 < 5' /etc/passwd
awk -F: '$3+$4 > 200' /etc/passwd
awk -F: '/docker|mail/{print $3+10}' /etc/passwd # 第三个字段加10打印
awk -F: '/docker/{print $3-$4}' /etc/passwd # 减法
awk -F: '/docker/{print $3*$4}' /etc/passwd # 求乘积
awk '/MemFree/{print $2/1024}' /proc/meminfo # 除法
awk '/MemFree/{print int($2/1024)}' /proc/meminfo # 取整

输出分隔符OFS

1
2
3
awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
# 输出字段6匹配WAIT的行,期中输出没行行号,字段4,5,6,并使用制表符分割字段

输出处理结果到文件

  1. 在命令代码块中直接输出
1
route -n|awk 'NR!=1{print > "./fs"}
  1. 使用重定向进行输出
1
route -n|awk 'NR!=1{print}' > ./fs

格式化输出

1
netstat -anp|awk '{print "%-8s %-9s %=10s\n",$1,$2,$3}'

 printf表示格式输出
 %格式化输出分隔符
 -8长度为8个字符
 s表示字符穿类型
 打印每行前三个字段,指定每个字段输出字符串类型(长度为8),第二个字段输出字符串类型(长度为8)
 第三个字段输出字符串类型(长度为10)

1
2
netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-10s %-10s %-10s \n",$1,$2,$3}'
netstat -anp|awk '$6=="LISTEN" || NR==1 {print "%-3s %-19s %-10s \n",NR,$1,$2,$3'

IF语句

1
2
3
4
5
6
7
8
9
10
11
12
awk -F: '{if($3>100)print "large";else print "smail"}' /etc/passwd
smail
smail
smail
large
smail
smail
smail
awk -F: 'BEGIN{A=0;B=0} {if($3>100) {A++;print "large"} else {B++;print "samil"}} END {print A,"\t" B}' /etc/passwd # ID大于100,A加1,否则B加1
awk -F: '{if($3<100) next;else print}' /etc/passwd
awk -F: 'BEGIN{i=1} {if(i<NF) print NR,NF,i++ }' /etc/passwd
awk -F: 'BEGIN{i=1} {if(i<NF) {print NR,NF}i++ }' /etc/passwd

 另一种形式:

1
2
awk -F: '{print ($3>100 ? "yes":"NO")}' /etc/passwd
awk -F: '{print ($3>100 ? $3":\tyes":$3":\tno")}' /etc/passwd

while语句

1
2
3
4
5
6
7
[root@docker-Reg ~]# awk -F: 'BEGIN{i=1} {while(i<NF) print NF,$i,i++}' /etc/passwd
7 root 1
7 x 2
7 0 3
7 0 4
7 root 5
7 /root 6

数组

1
2
netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a)print i,"\t",ap[i]}'
betstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a)printf "%-20s %-10s %-5s\n",i,"\t",a[i]}'

Author: focusshell

Link: http://focusshell.github.io/2018/08/28/Day-2-Awk命令下部/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
Day-3-AWk应用
NextPost >
开更声明
CATALOG
  1. 1. Awk命令下部分