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}'