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

 

正则表达式回顾:

正则表达式.jpg

 

重命名:

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/passwd1列和最后一列内容

#awk内置变量(shell 环境变量)

#NR 行号 number of record

#NF 每行有多少列 number of filed

#FS 指定的分隔符  -F:    ====  -vFS=:

#$1 $2  1 2

#$0     一整行的内容

#OFS    output 输出分隔符  显示每一列的时候 每一列之间通过什么分开

awk '{print $1,$2}'

 

awk内置参数.png

 

[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

awk调换第一列和最后一列说明.png

1.11 总结:

1.11.1 sed命令总结:

功能:增删改查

格式:找谁干啥

1.后向引用

2.sed命令中使用变量 for+sed

3.排除空行

4.批量修改文件名

5.批量添加用户

1.11.2 awk格式

比较表达式

NR>1

$5>500