1. awk
awk: 编程语言 GNU/awk
作用:
1.取行
2.取列
3.模糊过滤
4.数据统计 数据运算
5.支持for循环 if判断 数组..
6.格式化输出 sed后向引用
awk 语法结构
awk '子命令' ‘文件’ # 不加任何动作,默认为输出的动作
awk '子命令{print}' ‘文件’ # 模式+动作
其他的命令输出 | awk '模式'
2. awk按照行查找
语法结构:
sed -n '3p' file # sed 输出指定的行
awk 'NR==3' file # awk输出指定的行
awk的内置变量:
NR存放着文件中每行的行号NR的表达式:
== 等于第几行
> 大于第几行
< 小于第几行
>= 等于等于第几行
<= 小于等于第几行
!= 不等于
&& 并且
|| 或者
2.1.1 配置环境
[root@linux ~]# mkdir sjklx
[root@linux ~]# cd sjklx/
[root@linux sjklx]# touch test.txt
[root@linux sjklx]# head -5 /etc/passwd > test.txt
2.1.2 显示第三行
[root@linux sjklx]# awk 'NR==3' test.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin#在编程语言中,一个等号的意思是定义和赋值,而两个等号才是判断等于
2.1.3 显示小于3的行
[root@linux sjklx]# awk 'NR<3' test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
2.1.4 显示大于3的行
[root@linux sjklx]# awk 'NR>3' test.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
2.1.4 显示小于等于3的行
[root@linux sjklx]# awk 'NR<=3' 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
2.1.5 显示不等于3的行
[root@linux sjklx]# awk 'NR!=3' test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
2.2 并 和 或的应用
2.2.1 显示大于2 并且小于5的行
[root@linux sjklx]# awk 'NR>2&&NR<5' test.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
2.2.2 显示小于2 或者大于4的行
[root@linux sjklx]# awk 'NR<2||NR>4' test.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
2.3 模糊过滤文件内容
语法结构
grep '子命令' ‘文件’
sed -n '/内容/p' ‘文件’
awk '/内容/' ‘文件’
awk '//,//' ‘文件’
2.3.1 查找包含root的行
[root@linux sjklx]# awk '/root/' test.txt
1 root:x:0:0:root:/root:/bin/bash
2.3.2 查找r开头的行
[root@linux sjklx]# awk '/^r/' test.txt
root:x:0:0:root:/root:/bin/bash
2.3.3 查找h结尾的行
[root@linux sjklx]# awk '/h$/' test.txt
root:x:0:0:root:/root:/bin/bash
2.3.4 查找 a-d 开头的行
[root@linux sjklx]# awk '/^[a-d]/' 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
2.3.5 使用区间范围查找 r 开头到 d 的行
[root@linux sjklx]# awk '/^r/,/d/' 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
ps: 三剑客的扩展正则
grep -E 或者egrep
sed -r
awk 默认支持扩展正则
2.4 awk 取列
语法结构
awk '{print $n}' file
$0 awk的内置变量里面存放着每行的内容
$1 表示第1列 默认以空格和tab键为分隔符,如果文件中没有空格和tab键则文件内容被当做第一列
$2 表示第2列
, 逗号 内置变量,表示空格
NF 表示最后一列的列号
$NF 表示最后一列的内容
ps: 所有的字符串在awk中被识别为变量,所以输出字符串必须加双引号
2.4.1 为文件添加行号
[root@linux sjklx]# awk '{print NR " " $0}' test.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
行号行号与行之间的空格
当前行的内容
由于重定向会优先执行所以直接重定向修改原文件会导致结果为空
所以可以通过mv进行临时文件的替换
[root@linux sjklx]# awk '{print NR " " $0}' test.txt > temp.txt && mv temp.txt test.txt
mv:是否覆盖"test.txt"? y
[root@linux sjklx]# cat test.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
2.4.2 去除特殊符号来转换列
[root@linux sjklx]# sed -i 's#[:/]# #g' test.txt
[root@linux sjklx]# cat test.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、
2.4.3 显示第一 第三列
[root@linux sjklx]# awk '{print $1,$3}' test.txt
1 x
2 x
3 x
4 x
5 x
2.4.4 转义字符
[root@linux sjklx]# awk '{print $1"\t"$3}' test.txt
1 x
2 x
3 x
4 x
5 x
[root@linux sjklx]# awk '{print $1"\n"$3}' test.txt
1
x
2
x
3
x
4
x
5
xps:awk默认扩展正则 转义字符需要双引号才能被正确识别
2.4.5 输出最后一列
[root@linux sjklx]# awk '{print NF}' test.txt
9
9
9
10
11
2.5 awk通过通道处理命令
2.5.1 输出df -h 的第五列磁盘占比
[root@linux sjklx]# df -h|awk '{print $5}'
已用%
0%
0%
1%
0%
31%
1%
22%
1%
2.5.2 取出倒数第二列
[root@linux sjklx]# df -h | awk '{print NF-1}'
5
5
5
5
5
5
5
5
5
[root@linux sjklx]# df -h|awk '{print $(NF-1)}'
已用%
0%
0%
1%
0%
31%
1%
22%
1%
ps:不加括号会直接输出第六列 6-1 的结果 加了括号才能正确输出6-1列
2.6 awk指定分隔符
awk默认分隔符为tab或空格
子命令:-F
1.awk -F:
2.awk -F ":"
2.6.1 通过指定分隔符输出列
[root@linux sjklx]# head -5 /etc/passwd > test.txt
[root@linux sjklx]# cat 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[root@linux sjklx]# awk -F: '{print $1}' test.txt
root
bin
daemon
adm
lp
2.6.2 通过指定分隔符输出最后一列
[root@linux sjklx]# awk -F: '{print $NF}' test.txt
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
2.6.3 指定多个分隔符
[root@linux sjklx]# awk -F ":/" '{print $(NF-1),$NF}' test.txt
root bin/bash
bin sbin/nologin
sbin sbin/nologin
var/adm sbin/nologin
var/spool/lpd sbin/nologin
2.6.4 将连续出现1次及1次以上的指定分隔符作为1个整体
[root@linux sjklx]# awk -F "[:/]+" '{print $(NF-1),$NF}' test.txt
bin bash
sbin nologin
sbin nologin
sbin nologin
sbin nologin


被折叠的 条评论
为什么被折叠?



