其实很久以前我就开始学习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 ~]#