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