sed 命令可以很好的进行行匹配,但从某一行中精确匹配某些内容,则使用 grep 命令并辅以 -o 和 -E 选项可达到此目的。其中 -o 表示“only-matching”,即“仅匹配”之意,只输出匹配的部分。光用它不够,配合 -E 选项使用扩展正则表达式则威力巨大。
文件整理t9
整理文件:
employee文件中记录了工号和姓名
employee.txt:
100 Jason Smith
200 John Doe
300 Sanjay Gupta
400 Ashok Sharma
bonus文件中记录工号和工资
bonus.txt:
100 $5,000
200 $500
300 $3,000
400 $1,250
要求把两个文件合并并输出如下
处理结果:
400 ashok sharma $1,250
100 jason smith $5,000
200 john doe $500
300 sanjay gupta $3,000
脚本如下:
#!/bin/bash
#Test the list is in order or not
sort -c $1 > /dev/null 2>&1
sort -c $2 > /dev/null 2>&1
if [ $test1 -eq 0 ] && [ $test2 -eq 0 ];then
join -1 1 -2 1 $1 $2 | sort -k 2 | tr '[:upper:]' '[:lower:]'
else
sort -n -k 1,1 $1 >/tmp/tema
sort -n -k 1,1 $2 >/tmp/temb
join -1 1 -2 1 /tmp/tema /tmp/temb | sort -k 2 | tr '[:upper:]' '[:lower:]'
fi
执行结果:
root@ubuntu:~/test# ./t9.sh t9-emplyee.txt t9-bonus.txt
400 ashok sharma $1,250
100 jason smith $5,000
200 john doe $500
300 sanjay gupta $3,000
文本分析
取出password中login出现的次数
第一种方法结果:
4 /bin/bash
1 /bin/sync
1 /sbin/halt
31 /sbin/nologin
1 /sbin/shutdown
第二种方法结果:
/bin/sync 1
/bin/bash 1
/sbin/nologin 30
/sbin/halt 1
/sbin/shutdown 1
脚本如下:
#!/bin/bash
cat $1 | grep login >/tmp/tmpa
awk -F : '{print $6}' /tmp/tmpa |uniq -c >/tmp/tmpb
echo "The first method is:"
cat /tmp/tmpb
echo "The second method is:"
awk '{print $2,$1}' /tmp/tmpb
类似的:
文本如下t10-txt.txt:
binabdcbinddd
sd
awedk
bin
sbin
wellllllllll
niebin
1.统计每行bin出现的次数:
#!/bin/bash
grep -o $1 t10-file.txt|wc -l
执行:
root@ubuntu:~/exam-nov16# ./t10.sh bin
5
root@ubuntu:~/exam-nov16# ./t10.sh sd
1
root@ubuntu:~/exam-nov16# ./t10.sh i
6
或者
root@ubuntu:~/test# awk '{print gsub(/bin/,"&")}' t10-tx.txt
2
0
0
1
1
0
1
2.输出bin在全文总共出现的次数:
cat t10-tx.txt | grep -o "b"|wc -l
grep -o参数是只输出与指定字符匹配的部分,每匹配上一次,输出一个,立马换行。
sed 命令可以很好的进行行匹配,但从某一行中精确匹配某些内容,则使用 grep 命令并辅以 -o 和 -E 选项可达到此目的。其中 -o 表示“only-matching”,即“仅匹配”之意,只输出匹配的部分。光用它不够,配合 -E 选项使用扩展正则表达式则威力巨大。
awk '{s+=gsub(/bin/,"&")}END{print s}' t10-tx.txt
或者
awk -v RS='' '{print gsub(/bin/,"&")}' t10-tx.txt
或者
awk -v RS='@#' '{print gsub(/bin/,"&")}' t10-tx.txt
-v 是要用系统变量。
执行结果都是返回正确的数值:
root@ubuntu:~/test# awk '{s+=gsub(/bin/,"&")}END{print s}' t10-tx.txt
5
Note:gsub返回值是替换的次数。
参考:
http://www.oschina.net/question/920274_151833
https://zhidao.baidu.com/question/2203013122068491908.html
http://blog.youkuaiyun.com/zhuying_linux/article/details/7104938
sub 和gsub的区别 在http://blog.itpub.net/27042095/viewspace-1096916/
若是全文进行替换,最好用sed:
root@ubuntu:~/test# sed -n 's/bin/"&"/gp' t10-tx.txt
"bin"abdc"bin"ddd
"bin"
s"bin"
nie"bin"
此时的&是引用的前面的bin,或者也可以直接用“bin”,即替换成加引号的指定字符串。
打印本机的交换分区大小
处理结果类似:
Swap:1024M
root@ubuntu:~/test# free -m |grep -i swap|awk '{print $1 $2"M"}'
Swap:1021M