其实很久以前我就开始学习shell编程了,但是一直没有长进(本人比较笨拙)经过几天的思考。得出的结论意见非常明显!不用则罔!学到再多,记住的再多,如果你几个月不去会议思考总是会忘记的!
  所以我暂时拟定了“一天一道shell题”,这个学习办法 希望大家多多支持 我会在博客公开学到的一些方法 也请大家多多出题~

 

          2012/07/13  第二天

题目:查找特定字符串的行号

例:查找/et/passwd 中root所在的行号!

方法有四种:

方法一、

awk '/root/{print NR}' /etc/passwd

利用awk来打印出NR也就是行号

方法二、

grep -n 'root' /etc/passwd

利用grep 的-n 选项来完成

方法三、

awk '{if($0~/root/)print NR}' /etc/passwd

只是方法一的变相版

方法四、

grep -n root /etc/passwd |awk 'BEGIN{FS=":"}{print $1}'

还是变形版,前面管道符查找出root的行号和内容后面awk通过:这个特征分开域,然后打印第一个域 也就是行号!

 

附加一道题:

统计一个文件内任何符号的出现个数

 

方法:

awk '{for(i=1;i<=length($0);i++) ++S[substr($0,i,1)]}END{for(a in S) print S[a],a }' file

 

展示如下

[root@localhost ~]# cat abc.txt    
1111111111111111111
2222222222222222222
3333333333333333333
4444444444444444444
aaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb
ccccccccccccccccccc
ddddddddddddddddddd
abababababababababa
efefefefefefefefefe
 
结果如下
[root@localhost ~]# awk '{for(i=1;i<=length($0);i++) ++S[substr($0,i,1)]}END{for(a in S) print S[a],a }' abc.txt    
19 4
29 a
28 b
19 c
19 d
10 e
19 1
9 f
19 2
19 3
[root@localhost ~]#