Day 32 三剑客-sed-awk
1.1 三剑客之sed
1.1.1 sed
#c replace 替换
#a append 追加
#i insert 插入
准备环境
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
第三行下面追加一行
[root@oldboyedu50-lnb ~]# sed '3a12306,xiao,UFO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
12306,xiao,UFO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
12306,xiao.UFO
查看文件内容
[root@oldboyedu50-lnb ~]# cat person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
12306,xiao.UFO
[root@oldboyedu50-lnb ~]# sed '3c12306,xiao,UFO' person.txt 替换当前行的内容(第3行)
101,oldboy,CEO
102,zhangyao,CTO
12306,xiao,UFO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
12306,xiao.UFO
在文件最后一行增加
12306,xiao,UFO
12580,tao,XO
[root@oldboyedu50-lnb ~]# sed '$a12306,xiao,UFO\n12580,tao,XO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
12306,xiao.UFO
12306,xiao,UFO
12580,tao,XO
1.2 修改配置文件
方法一:echo >>
方法二:cat >>oldboy.txt<<EOF
EOF
sudo === /etc/sudoers
cron === /var/spool/cron/
挂载 === /etc/fstab
解析主机名 === /etc/hosts
网卡配置文件 === /etc/sysconfig/network-scripts/ifcfg-eth0
1.3 sed命令 删除 delete d
1.3.1 #删除第2行到底5行
sed ‘2,5d’ filename
1.3.2 #删除从yy开始的行到文件结尾的内容
sed ‘/yy/,$d’filename
1.3.3 #删除包含lidao的行
sed '/lidao/d' filename
1.3.4 #删除不包含lidao的行
sed '/lidao/!d' person.txt
1.4 企业案例:不显示文件中的空行
准备环境-àlidao.txt
1.4.1 基础
grep -v '^$' lidao.txt
sed '/^$/d' lidao.txt
awk '!/^$/' lidao.txt
sed -n '/^$/!p' lidao.txt
awk NF lidao.txt
1.4.2 进阶
不显示文件中的空行
文件中可能有空行 只包含空格的行
准备环境
[root@oldboyedu50-lnb ~]# egrep -v '^$|^ +$' lidao.txt
oldboy
oldboy
lidao
lidao
egrep -v '^$|^ +$' lidao.txt
1.5 替换 s substitute
‘s###g’ g === global 全局
[root@oldboyedu50-lnb ~]# sed 's#[0-9]##g' person.txt
,oldboy,CEO
,zhangyao,CTO
,Alex,COO
,yy,CFO
,feixue,CIO
,lidao,COCO
,xiao.UFO
[root@oldboyedu50-lnb ~]# sed 's#[0-9]##' person.txt
01,oldboy,CEO
02,zhangyao,CTO
03,Alex,COO
04,yy,CFO
05,feixue,CIO
10,lidao,COCO
2306,xiao.UFO
1.6 sed后向引用
[root@oldboyedu50-lnb ~]# ifconfig eth0 |sed -rn '2s#^.*r:(.*) Bc.*#\1#gp'
10.0.0.200
[root@oldboyedu50-lnb ~]# ifconfig eth0 |awk -F'[ :]+' 'NR==2{print $4}'
10.0.0.200
[root@oldboyedu50-lnb ~]# ifconfig eth0 |awk -F'addr:| Bc' 'NR==2{print $2}'
10.0.0.200
[root@oldboyedu50-lnb ~]# ifconfig eth0 |awk -F'[^0-9.]+' 'NR==2{print $2}'
10.0.0.200
1.7 sed命令中使用变量
[root@oldboyedu50-lnb ~]# x=oldboy 赋值
[root@oldboyedu50-lnb ~]# y=oldgirl
[root@oldboyedu50-lnb ~]# sed 's#$x#$y#g' person.txt 所见即所得,直接输出
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
12306,xiao.UFO
[root@oldboyedu50-lnb ~]# sed "s#$x#$y#g" person.txt 解析特殊符号
101,oldgirl,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
12306,xiao.UFO
1.7.1 把文件person.txt文件中的每一行的内容 替换为对应的行号
101,oldboy,CEO 将101...12306替换为1 2 3 ...
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
12306,xiao.UFO
1
2
3
4
5
6
7
for n in {1..7} for循环
do
sed -i.bak "${n}s#.*#$n#g" person.txt
done
正则表达式回顾:
重命名:
mv oldboy.txt alex.txt
1.7.2 批量重命名:删除文件名中的html_
touch oldboy_html_{01..10}.jpg
方法1:sed 拼接
[root@XZ_aya /oldboy]#ls |sed -r 's#(^.*)(h.*l_)(.*$)#mv \1\2\3 \1\3#g' 后接|bash运行即可
mv oldboy_html_01.jpg oldboy_01.jpg
mv oldboy_html_02.jpg oldboy_02.jpg
mv oldboy_html_03.jpg oldboy_03.jpg
mv oldboy_html_04.jpg oldboy_04.jpg
mv oldboy_html_05.jpg oldboy_05.jpg
mv oldboy_html_06.jpg oldboy_06.jpg
mv oldboy_html_07.jpg oldboy_07.jpg
mv oldboy_html_08.jpg oldboy_08.jpg
mv oldboy_html_09.jpg oldboy_09.jpg
mv oldboy_html_10.jpg oldboy_10.jpg
方法2:for循环
[XZ_aya /oldboy]#for i in {01..10} ;do echo oldboy_html_$i.jpg oldboy_$i.jpg;done
echo改为mv即可
oldboy_html_01.jpg oldboy_01.jpg
oldboy_html_02.jpg oldboy_02.jpg
oldboy_html_03.jpg oldboy_03.jpg
oldboy_html_04.jpg oldboy_04.jpg
oldboy_html_05.jpg oldboy_05.jpg
oldboy_html_06.jpg oldboy_06.jpg
oldboy_html_07.jpg oldboy_07.jpg
oldboy_html_08.jpg oldboy_08.jpg
oldboy_html_09.jpg oldboy_09.jpg
oldboy_html_10.jpg oldboy_10.jpg
方法3:命令 rename
rename oldboy oldgirl *.jpg
找谁 替换为什么 替换哪些文件
1.8 find命令找出包含特殊符号文件名案例
[root@oldboyedu50-lnb /oldboy/name]# find /oldboy -type f -name "*.jpg" -print0 |xargs -0 ls -l
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 01.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 02.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 03.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 04.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 05.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 06.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 07.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 08.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 09.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 10.jpg
#让find命令给每个文件名的结束处 加上一个结束标记
#-print0
#xargs -0 可以识别标记
1.9 sed命令总结:
功能:增删改查
格式:找谁干啥
1.后向引用
2.sed命令中使用变量 for+sed
3.排除空行
4.批量修改文件名
5.批量添加用户
1.10 awk 模式匹配与处理语言
gnu awk gawk
-F 指定分隔符
-v 定义变量
awk -F: 'NR==1{print $1,$3}' /etc/passwd
'条件 {动作}'
pattern {命令}
模式
1.10.1 调换/etc/passwd第1列和最后一列内容
#awk内置变量(shell 环境变量)
#NR 行号 number of record
#NF 每行有多少列 number of filed
#FS 指定的分隔符 -F: ==== -vFS=:
#$1 $2 第1列 第2列
#$0 一整行的内容
#OFS output 输出分隔符 显示每一列的时候 每一列之间通过什么分开
awk '{print $1,$2}'
[root@oldboyedu50-lnb /oldboy]# awk -F: -vOFS=: '{print $NF,$2,$3,$4,$5,$6,$1}' passwd.txt
/sbin/nologin:x:1:1:bin:/bin:bin 调换/etc/passwd第1列和最后一列内容
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mail:mail
/sbin/nologin:x:10:14:uucp:/var/spool/uucp:uucp
[root@oldboyedu50-lnb /oldboy]# awk -F: -vOFS=: '{tmp=$1;$1=$NF;$NF=tmp;print}' passwd.txt 调换/etc/passwd第1列和最后一列内容
/bin/bash:x:0:0:hahaha:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mail:mail
/sbin/nologin:x:10:14:uucp:/var/spool/uucp:uucp
1.11 总结:
1.11.1 sed命令总结:
功能:增删改查
格式:找谁干啥
1.后向引用
2.sed命令中使用变量 for+sed
3.排除空行
4.批量修改文件名
5.批量添加用户
1.11.2 awk格式
比较表达式
NR>1
$5>500
转载于:https://blog.51cto.com/13859649/2162496