鸟同学的几道经典shell题

来源:互联网 发布:七天网络阅卷系统登录 编辑:程序博客网 时间:2024/05/06 20:35

sed 命令可以很好的进行行匹配,但从某一行中精确匹配某些内容,则使用 grep 命令并辅以 -o 和 -E 选项可达到此目的。其中 -o 表示“only-matching”,即“仅匹配”之意,只输出匹配的部分。光用它不够,配合 -E 选项使用扩展正则表达式则威力巨大。

文件整理t9

整理文件:

employee文件中记录了工号和姓名employee.txt:100 Jason Smith200 John Doe300 Sanjay Gupta400 Ashok Sharmabonus文件中记录工号和工资bonus.txt:100 $5,000200 $500300 $3,000400 $1,250要求把两个文件合并并输出如下处理结果:400 ashok sharma $1,250100 jason smith  $5,000200 john doe  $500300 sanjay gupta  $3,000

脚本如下:

#!/bin/bash#Test the list is in order or notsort -c $1 > /dev/null 2>&1sort -c $2 > /dev/null 2>&1if [ $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.txt400 ashok sharma  $1,250100 jason smith $5,000200 john doe $500300 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/bashcat $1 | grep login >/tmp/tmpaawk -F : '{print $6}' /tmp/tmpa |uniq -c >/tmp/tmpbecho "The first method is:"cat /tmp/tmpbecho "The second method is:"awk '{print $2,$1}' /tmp/tmpb

类似的:
文本如下t10-txt.txt:

binabdcbindddsdawedkbinsbinwellllllllllniebin

1.统计每行bin出现的次数:

#!/bin/bashgrep -o $1 t10-file.txt|wc -l 

执行:

root@ubuntu:~/exam-nov16# ./t10.sh bin5root@ubuntu:~/exam-nov16# ./t10.sh sd1root@ubuntu:~/exam-nov16# ./t10.sh i6

或者

root@ubuntu:~/test# awk  '{print gsub(/bin/,"&")}' t10-tx.txt 2001101

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.csdn.net/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

题源

http://rainbird.blog.51cto.com/211214/165779/

1 0
原创粉丝点击