鸟同学的几道经典shell题

本文介绍了一系列Shell脚本的应用案例,包括文件合并、文本分析、关键词计数等操作,并提供了具体的脚本实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

题源

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值