awk
可以做运算
awk语法结构:
awk '{print xx}'
awk '{动作}' file #如果不加print默认就是输出
awk '模式{动作}' file
awk '找谁 干啥' file
找谁:找行 找列 字符串
动作:都是在{}
awk指定行查找
环境准备
[root@shang:~]# cat a.txt
1 aaa
2 vvv
3 bbb
4 ddd
5 ccc
6 kkk
7 lll
8 aaa
9 uuu
10 bbb
11 ddd
12 ooo
awk 'NR==行数' file
比较符:
!= 不等于
== 相等
> 大于
>= 大于等于
< 小于
<= 小于等于
区间范围:
&& 并且
|| 或者
案例1:查找第一行的内容
[root@shang:~]# awk 'NR==1' a.txt
1 aaa
案例2:查找大于8的行 #可以 >= 大于等于
[root@shang:~]# awk 'NR>=8' a.txt
8 aaa
9 uuu
10 bbb
11 ddd
12 ooo
案例3:查找小于3的行 #可以 <= 小于等于
[root@shang:~]# awk 'NR<3' a.txt
1 aaa
2 vvv
案例4:查找不等于4的行
[root@shang:~]# awk 'NR!=4' a.txt
1 aaa
2 vvv
3 bbb
5 ccc
6 kkk
7 lll
8 aaa
9 uuu
10 bbb
11 ddd
12 ooo
案例5:查找小于10的行大于3的行
[root@shang:~]# awk 'NR<10&&NR>3' a.txt
4 ddd
5 ccc
6 kkk
7 lll
8 aaa
9 uuu
案例6:查找大于10的行或者小于3的行
[root@shang:~]# awk 'NR>10||NR<3' a.txt
1 aaa
2 vvv
11 ddd
12 ooo
awk取列
语法结构:
awk '{print $1}' file #获取文件第一列内容
awk -F: 指定分隔符
awk -F ":"
如果指定冒号为分隔符 空格失效 会打印出来
可以指定任意的字符为字符串 可以指定多个
eg;awk -F ":/" '{print $}' file
:/ 分割为整体
awk默认以空格或者tab键作为列的分割符
$0 表示每行的内容 所有
$1 表示第一列
$2 表示第二列
......
$NF #表示最后一列 #NF存放最后一列的列号 加上$
案例1:查找第一行第二列
[root@shang:~]# awk 'NR==1{print $2}' a.txt
aaa
案例2:查找最后一列
[root@shang:~]# awk '{print $NF}' a.txt
aaa
vvv
bbb
ddd
ccc
kkk
lll
aaa
uuu
bbb
ddd
ooo
案例3:查找倒数第二列 加减乘除先算括号
[root@shang:~]# awk '{print $(NF-1)}' a.txt
1
2
3
4
5
6
7
8
9
10
11
12
案例4:查找第10行的倒数第二列
[root@shang:~]# awk 'NR==10{print $(NF-1)}' a.txt
10
案例5:指定分隔符
环境:
[root@shang:~]# tail /etc/passwd >> b.txt
[root@shang:~]# cat b.txt
tcpdump:x:72:72::/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
zabbix:x:990:986:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
www:x:666:666::/home/www:/bin/bash
wen:x:1003:1003::/home/wen:/bin/bash
shang:x:1004:1004::/home/shang:/bin/bash
shang1:x:1008:1008::/home/shang1:/bin/bash
shang2:x:1009:1009::/home/shang2:/bin/bash
shang3:x:1010:1010::/home/shang3:/bin/bash
案例6:指定多个符号为分隔符 :/为一个整体 输出第二列
[root@shang:~]# awk -F":/" '{print $2}' b.txt
etc/ntp
var/lib/mysql
var/lib/zabbix
home/www
home/wen
home/shang
home/shang1
home/shang2
home/shang3
案例7:取多列
[root@shang:~]# awk -F: '{print $2,$4}' b.txt
x 72
x 38
x 27
x 986
x 666
x 1003
x 1004
x 1008
x 1009
x 1010
案例8:任意单个符号
[root@shang:~]# awk -F[:/] '{print $1}' b.txt
tcpdump
ntp
mysql
zabbix
www
wen
shang
shang1
shang2
shang3
案例9:连续或一次以上的都匹配一次 eg::/ 或 : 或 /
[root@shang:~]# awk -F[:/]+ '{print $5}' b.txt
sbin
etc
MySQL Server
Zabbix Monitoring System
home
home
home
home
home
home
awk匹配字符串
语法结构:
grep'字符串' file
sed -n '/字符串/p' file
awk '/字符串/' file
默认支持拓展正则
案例1:查找包含shang1的行
[root@shang:~]# awk -F[:/]+ '/shang1/{print $1}' b.txt
shang1
案例2:区间范围
[root@shang:~]# awk '/vvv/,/kkk/' a.txt
2 vvv
3 bbb
4 ddd
5 ccc
6 kkk
案例3:默认支持正则
开头:
[root@shang:~]# awk '/^1/' a.txt
1 aaa
10 bbb
11 ddd
12 ooo
结尾:
[root@shang:~]# awk '/c$/' a.txt
5 ccc
案例4:匹配$1=www的行
[root@shang:~]# awk -F: '$1=="www"{print $2,$3}' b.txt
x 666
awk模式+动作
语法格式:
awk 'NR==3{print $3}' file
awk '找谁{动作}'
找谁:
awk 'NR==3'
awk '$1="root"'
awk '/root/'
awk '/n$/'
awk '/^s/'
#统计/etc/passwd中每个单词出现的数量
cat /etc/passwd | sed 's#[:/0-9]# #g'| sort | xargs -n1 | grep . -o|sort|uniq -c|sort -n