6.写入对应行
sed "2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" passwd.txt.bak -i
每行都加个分隔符
sed "a ----------------------------------------------------" passwd.txt.bak -i
7.实例
拿出ip和子网掩码和广播地址
ifconfig ens33 | sed "2p" -n | sed "s/^.*inet//"
五、awk
awk更像一门编程语言,支持条件判断、数组、循环等功能
三剑客的各个特点
- grep,擅长单纯的查找或匹配文本内容
- awk,更适合编辑、处理匹配到的文本内容
- sed,更适合格式化文本内容,对文本进行复杂处理
三个命令称之为Linux的三剑客
1.awk基础
awk语法:
awk [option] 'pattern[action]' file...
awk 参数 '条件动作' 文件
2.举例
空格作为分隔符
$0 代表一整行
$1 代表第一列
$2 代表第二列
...
awk '{print $1}' 1.txt
3.NF和NR
awk '{print $NF}' 1.txt awk '{print $NR}' 1.txt
NR显示文件第五行
awk 'NR==5' 1.txt
NR显示文件第二行到第五行
root@ou-virtual-machine:~# awk 'NR==2,NR==5' 1.txt a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25
4.字符串占位
输出默认不带分隔符
root@ou-virtual-machine:~# awk '{print $1 $2 $3}' 1.txt a1a2a3 a6a7a8 a11a12a13 a16a17a18 a21a22a23 root@ou-virtual-machine:~# awk '{print $1__$2__$3}' 1.txt a1a2a3 a6a7a8 a11a12a13 a16a17a18 a21a22a23
逗号会默认加空格分隔符
root@ou-virtual-machine:~# awk '{print $1,$2,$3}' 1.txt a1 a2 a3 a6 a7 a8 a11 a12 a13 a16 a17 a18 a21 a22 a23
"字符串"分隔符
root@ou-virtual-machine:~# awk '{print "1 List: "$1,"2 List: "$2,"3 List: "$3}' 1.txt 1 List: a1 2 List: a2 3 List: a3 1 List: a6 2 List: a7 3 List: a8 1 List: a11 2 List: a12 3 List: a13 1 List: a16 2 List: a17 3 List: a18 1 List: a21 2 List: a22 3 List: a23 1 List: 2 List: 3 List:
5.awk参数
前面的文件分隔符是空格,awk自动识别空格作为分隔符
但是如果我们用其他的分割符,那么awk并不会自动识别
root@ou-virtual-machine:~# cat 1.txt a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 root@ou-virtual-machine:~# cat 1.txt.bak a1#a2#a3#a4#a5 a6#a7#a8#a9#a10 a11#a12#a13#a14#a15 a16#a17#a18#a19#a20 a21#a22#a23#a24#a25 root@ou-virtual-machine:~# awk "{print $1}" 1.txt.bak a1#a2#a3#a4#a5 a6#a7#a8#a9#a10 a11#a12#a13#a14#a15 a16#a17#a18#a19#a20 a21#a22#a23#a24#a25
通过-F来修改识别分隔符
cat 1.txt.bak | awk -F"#" '{print $1}'
小写f
root@ou-virtual-machine:~# echo '"{print}"' > 1 root@ou-virtual-machine:~# awk -f 1 1.txt a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25
6.awk变量
取出本机的ip
第一步先取出ifconfig第二行的数据
ifconfig | awk 'NR==2{print $0}'
ifconfig | awk 'NR==2{print $0}' | awk '{print $2}'
7.awk的分隔符
- 输入分隔符,awk默认是空格,空白字符,变量名是FS
- 输出分隔符,OFS
FS输入分隔符
awk逐行处理文本的时候,以输入分隔符为准,把文本切成多个片段,默认符号是空格
当我们处理特殊文件,没用空格的时候,可以自由指定分隔符
awk -F '#' '{print $1}' 1.txt.bak
修改默认输出符
root@ou-virtual-machine:~# awk -F '#' '{print $1,$2,$4}' 1.txt.bak a1 a2 a4 a6 a7 a9 a11 a12 a14 a16 a17 a19 a21 a22 a24 root@ou-virtual-machine:~# awk -F '#' -v OFS=': ' '{print $1,$2,$4}' 1.txt.bak a1: a2: a4 a6: a7: a9 a11: a12: a14 a16: a17: a19 a21: a22: a24 : : root@ou-virtual-machine:~#
8.awk的变量
NR、NF和FNR变量
[root@localhost ~]# awk -F "#" '{print NR,NF,$1,$2}' 1 1 5 a1 a2 2 5 a6 a7 3 5 a11 a12 4 5 a16 a17 5 5 a21 a22
NR和FNR的区别
[root@localhost ~]# awk -F "#" '{print FNR,$1,$2}' 1 1 1 a1 a2 2 a6 a7 3 a11 a12 4 a16 a17 5 a21 a22 1 a1 a2 2 a6 a7 3 a11 a12 4 a16 a17 5 a21 a22 [root@localhost ~]# awk -F "#" '{print NR,$1,$2}' 1 1 1 a1 a2 2 a6 a7 3 a11 a12 4 a16 a17 5 a21 a22 6 a1 a2 7 a6 a7 8 a11 a12 9 a16 a17 10 a21 a22
ORS和RS
[root@localhost ~]# awk -F "#" '{print RS="-------",$1,$2}' 1 ------- a1 a2 ------- a6 a7 [root@localhost ~]# awk -F "#" '{print ORS="-------",$1,$2}' 1 ------- a1 a2-------------- a6 a7-------------- a11 a12-------------- a16 a17-------------- a21 a22-------[ [root@localhost ~]#
FILENAME
数组
默认数组
[root@localhost ~]# awk "{print ARGV[0],$0}" 1 awk 0 awk 0 awk 0 awk 0 awk 0 [root@localhost ~]# awk "{print ARGV[1]}" 1 1 1 1 1 1 [root@localhost ~]# awk "{print ARGV[2]}" 1
[root@localhost ~]# awk '{print ARGV[0],ARGV[1],ARGV[2]}' 1 1 awk 1 1 awk 1 1 awk 1 1 awk 1 1 awk 1 1 awk 1 1 awk 1 1 awk 1 1 awk 1 1 awk 1 1 [root@localhost ~]#
自定义变量
[root@localhost ~]# awk -v myname='o' 'BEGIN{print "myname=",myname}' myname= o [root@localhost ~]#
9.awk格式化输出
print和printf的区别
printf需要自定义格式
awk '{printf $0}' 1 a1#a2#a3#a4#a5a6#a7#a8#a9#a10a11#a12#a13#a14#a15a16#a17#a18#a19#a20a21#a22#a23#a24#a25[root@localhost ~]# [root@localhost ~]#
自定义格式
[root@localhost ~]# printf "%s\n" a b c d e a b c d e
[root@localhost ~]# awk 'BEGIN{printf "%s\n%s\n",1,2,3,4,5}' 1 2
区别