侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

20170210--sed/awk

2023-11-27 星期一 / 0 评论 / 0 点赞 / 70 阅读 / 10581 字

sed 用来改文件 awk用来分析文件 sed工具 增、删、查、改 [root@up12 ~]# grep -A 2 root /etc/passwd //A=after ,root后面的两

sed 用来改文件
awk用来分析文件
 

sed工具


增、删、查、改
 

[root@up12 ~]# grep -A 2 root /etc/passwd   //A=after ,root后面的两行root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin--operator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologingopher:x:13:30:gopher:/var/gopher:/sbin/nologin[root@up12 ~]# grep -B 2 root /etc/passwd   //B=before root前面两行root:x:0:0:root:/root:/bin/bash--mail:x:8:12:mail:/var/spool/mail:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologin[root@up12 ~]# grep -C 2 root /etc/passwd  //C  root前后两行root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin--mail:x:8:12:mail:/var/spool/mail:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologingopher:x:13:30:gopher:/var/gopher:/sbin/nologin[root@up12 ~]# 
[root@up12 ~]# grep -C 2 root /etc/passwd > /tmp/abd[root@up12 ~]# cat /tmp/abd root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin--mail:x:8:12:mail:/var/spool/mail:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologingopher:x:13:30:gopher:/var/gopher:/sbin/nologin[root@up12 ~]# sed -i.bak 'd' /tmp/abd  //‘d ’是删除文件里的内容,-i.bak给文件一个备份 [root@up12 ~]# cat /tmp/abd[root@up12 ~]# cat /tmp/abd.bak root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin--mail:x:8:12:mail:/var/spool/mail:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologingopher:x:13:30:gopher:/var/gopher:/sbin/nologin


根据行号删除

[root@up12 ~]# cat /tmp/xyz.123 aabbccddeeff[root@up12 ~]# sed '2d' /tmp/xyz.123 aaccddeeff[root@up12 ~]# [root@up12 ~]# cat /tmp/xyz.123 aabbccddeeff[root@up12 ~]# sed '/bb/d' /tmp/xyz.123 aaccddeeff[root@up12 ~]# [root@up12 ~]# sed -n '2d' /tmp/xyz.123   //-n非标准输出[root@up12 ~]# sed '3p' /tmp/xyz.123   //p  sed中的打印aabbccccddeeff[root@up12 ~]# sed -n  '3p' /tmp/xyz.123 cc[root@up12 ~]# sed -i -n '3p' /tmp/xyz.123  //-i 将命令的输出保存到文件中[root@up12 ~]# cat /tmp/xyz.123 cc[root@up12 ~]# sed -e '2d' -e '5d' /tmp/xyz.123 aaccddffgg[root@up12 ~]# sed  '2d;5d' /tmp/xyz.123 aaccddffgg[root@up12 ~]# sed '3ihello' /tmp/xyz.123  //i插入aabbhelloccddeeffgg[root@up12 ~]# sed '3ahello' /tmp/xyz.123  //a增加aabbcchelloddeeffgg[root@up12 ~]# sed '$!d' /tmp/xyz.123  //$!d 不删除最后一行gg[root@up12 ~]# sed '2!d' /tmp/xyz.123  //不删除第二行bb[root@up12 ~]# 



搜素替换

sed 's/原字符串/替换字符串/' //替换所有匹配关键字

sed 's/^/添加的头部&/g' //在所有行首添加
sed 's/$/&添加的尾部/g' //在所有行末添加
sed '2s/原字符串/替换字符串/g' //替换第2行
sed '$s/原字符串/替换字符串/g' //替换最后一行
sed '2,5s/原字符串/替换字符串/g' //替换2到5行
sed '2,$s/原字符串/替换字符串/g' //替换2到最后一行

sed 's/^/添加的头部&/g;s/$/&添加的尾部/g' //同时执行两个替换规则

[root@up12 ~]# sed '/b/cuplooking' /tmp/xyz.123 aauplookingccddeeffgg[root@up12 ~]# sed '/^HOSTNAME=.*/HOSTNAME=abc/' /etc/sysconfig/networksed: -e expression #1, char 16: extra characters after command[root@up12 ~]# cat /etc/sysconfig/networkNETWORKING=yesHOSTNAME=up12.up.com[root@up12 ~]# sed '/HOSTNAME=.*/ c HOSTNAME=abc' /etc/sysconfig/networkNETWORKING=yesHOSTNAME=abc



d p i a c
 

[root@up12 ~]# sed '=' /tmp/xyz.123   // 用=增加编号1aa2bb3cc4dd5ee6ff7gg[root@up12 ~]# sed '=' /tmp/xyz.123 |sed '1~2{N;s//n/ /}'1 aa2 bb3 cc4 dd5 ee6 ff7 gg[root@up12 ~]# sed -n '$=' /tmp/xyz.123   //显示最后一行行号7


sed -f //从文件中读取
[root@up12 ~]# sed -n '10,15p' /etc/passwd

[root@up12 ~]# sed -n '10,15p;15q' /etc/passwd  //打印10-15行,第15行后退出
 

 

AWK:适合处理大文件





sed awk 都可以以脚本的形式运行和shell 脚本一样需要指定解释器,加上执行权限

#!/bin/sed -f
#! /usr/bin/awk -f
awk脚本一共有三个模块  BEGIN是读取内容之前就会开始执行,BEGIN和END 只执行一次,中间的函数一行一行的依次执行


我们可以在awk脚本中使用while函数进行循环

[kate@up12 ~]$ vim awk-while.awk[kate@up12 ~]$ chmod +x awk-while.awk [kate@up12 ~]$ ./awk-while.awk 0123456789[kate@up12 ~]$ cat awk-while.awk #! /usr/bin/awk -f#BEGIN {                       //函数从begin开始执行i=0while (i<10){  print i  i++}}[kate@up12 ~]$ 

awk中的内建函数,可以直接引用

[kate@up12 ~]$ ./func.awk 13uplooking.comUPLOOKING.COM[kate@up12 ~]$ cat func.awk #!/bin/awk -f#BEGIN {	a = "uplooking.com"	print length(a)	print tolower(toupper(a))	print toupper(a)}[kate@up12 ~]$ 
  1 #!/bin/awk -f  2 #  3 BEGIN {  4         a = "uplooking.com"  5         print length(a)  6         print tolower(toupper(a))  7         gsub("o","O",a)   //将小写字母o替换为大写字母  8         print a  9 }~         

在awk中我们也可以自定义脚本

 

awk以在命令行中使用,得到IP
awk -F [ :] //以空格和:进行分隔

可以用FS自定义分隔符,但是要放到BEGIN{ }函数里

[root@up12 shell]# ifconfig eth0| awk -F"[ :]" '/inet addr/{print $13}'
192.168.30.153   //awk在在命令中的使用

awk 写入脚本中,得到IP

方法一:

sub()  相当于 s/xxx/xxx

gsub()      相当于s/xxx/xxx/g

toupper()

tolower()

length( )

[kate@up12 ~]$ cat length.awk #!/bin/awk -f#函数length#{  print length($0)}[kate@up12 ~]$ ./length.awk /etc/passwd313239

index(s,t)  //返回t在s的位置,如果s中不包含t则输入0  

[kate@up12 ~]$ echo "abc abc123ssd"|awk  '{print index($2,$1)}'
1
[kate@up12 ~]$ echo "abc 1235abc123ssd"|awk  '{print index($2,$1)}'
5


统计有多少个用户的密码中包含了用户名

  1 #!/bin/awk -f  2 #  3   4 BEGIN {  5     FS = "#"  6     count = 0  7 }  8   9 { 10     if (index($2,$1)) { 11         count++ 12     } 13 } 14  15 END { 16     print count 17 } 18 

 

 

 

awk 中的字符串要用 “ ”引起来

[root@up12 ~]# awk '{if (NR == 3) {print $0}}' /etc/passwd  //NR表示行号,$0表示正行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
NR的循环

 

awk 自定义函数

[kate@up12 ~]$ ./function.awk 55[kate@up12 ~]$ cat function.awk #!/bin/awk -f#自定义函数#function add(n1,n2){  sum=n1+n2  return sum}BEGIN {  print add(22,33)}

 

 

小程序:密码大于8位的用户一共有多少人

方法一:

[kate@up12 ~]$ cat  txt/upasswd.txt |cut -d "#" -f2| while read pass;do if [ "${#pass}" -gt 8 ];then echo $pass;fi;done   //后面再加上管道符wc -l即可知道数量fghsfghesf2154632561234567489

 

方法二:

  1 #!/bin/bash  2 #密码大于8位数  3 #  4   5 file=$1  6 : ${file:=/home/kate/txt/upasswd.txt}  7 #如果file不存在就给他指定文件  8 count=0  9  10 while read line;do 11         pass=`echo $line |cut -d "#" -f2` 12         if [ "${#pass}" -gt 8 ];then 13 #${#pass} 统计字符的长度 14           let count++ 15         fi 16 done < $file 17  18 echo $count 


方法三: awk

  1 #!/bin/awk -f   2 #密码大于8位的用户数量  3 #  4   5 BEGIN {  6     FS="#"  7     count=0  8 }  9  10 { 11     if (length($2) > 8){ 12         count++ 13     } 14 } 15  16 END { 17     print count 18 }

 

数组:

[kate@up12 ~]$ ./tom.sh home = /home/tomgid = 600uid = 50035 = 550 = 111 = 22[kate@up12 ~]$ cat tom.sh #!/bin/awk -f#数组的介绍#BEGIN {    tom["uid"] = 500    tom["gid"] = 600    tom["home"] = "/home/tom"        for (i in tom) {	print i ,"=",tom[i]    }    user[0] = 11    user[1] = 22    user[5] = 55    print length(user)    for (j in user) {	print j,"=",user[j]    }}

数组方法统计密码出现的次数

  1 #!/bin/awk -f  2 #用数组方式统计密码出现的次数  3 #  4   5 BEGIN {  6     FS="#"  7 }  8   9 { 10     count[$2]++ 11 } 12  13 END { 14     for (sh in count) { 15         print sh,count[sh] 16     } 17 }

 

汉英在线字典

  1 #!/bin/bash  2 #汉英在线字典  3 #  4   5 word=$1  6   7 if [ -z "$word" ];then  8     echo "Usage: $0 WORD"  9     exit 1 10 fi 11  12 #curl -s "http://dict.cn/$word" |grep "<li><span>.*</span><strong>.*</strong></li>" |sed 's/<li><span>//' |sed 's@</span>    <strong>@ @'|sed 's@</strong></li>@@'|sed -r 's/^/s+//' 13  14 curl -s "http://dict.cn/$word" |tr '/r' '/n' |sed -n -r '/.*<li><span>(.*)<//span><strong>(.*)<//strong><//li>.*/ {s///1     /2/;p}'

 

广告 广告

评论区