awk 和 sed 使用案例

1.模仿wc的行为,统计一个文本文件的文件的字符数、行数、单词数.

awk '{numOfChar+=length($0);numOfWord+=NF}END{print numOfChar" " numOfWord" "NR }' file

2.上面的例子中有个问题,统计的字符数中包含空格,那么不包含空格的字符数要怎么算?

awk '{for (i=1; i<=NF; i++) numOfChar+=length($i)}END{print numOfChar}' file

3.awk中如何引用外部变量

name="pola"
echo "" | awk '{print "awk awk awk" “'$name'”}'

双引号里单引号里$var.

4.awk数值计算中,如何将一个字符串识别为一串数字?

0开头的字符串按8进制识别,0x开头的字符串按照16进制识别,除此之外按照十进制。这些都是理想的情况,对于其他的情况则按照最长前缀匹配,即有多少匹配多少。

echo "0x12" | awk '{printf("%d\n",strtonum($0));}'

5. 点(.)开头的单词怎么整?

readelf一个.o文件会有.text段的内容出来,如果想找出包含".text"单词的行呢?注意,这个“单词”就是一个点开头,然后后面接了一个正规的单词,其实这并不是个单词!所以当我们使用grep "\b\.text\b"去筛选这样一行时,根本就筛不出来,为什么?\b是个元字符,也是个零宽断言,你可以认为它会匹配这样一个奇怪的位置:两个字符的中间!它就去匹配(数字、字母、下划线)与(空格,标点符号,换行符)中间的位置。现在好了,我们的.text,由于点的左面是个空格,所以空格与点之间并不能匹配上\b,所以使用\b就搜不出来一个单词喽!

6. 读某.o文件中代码段在该文件的偏移

readelf -S write.o | awk '/\s\.text/{sub(/\[.*\]/,"",$0); print $4}'

【awk中模式的部分以及sub等子函数中,正则表达式放在/ /中】

7. 查找当前目录下所有的.c文件和.h文件

find . -regextype "posix-egrep" -regex ".*(\.c|\.h)$"

【find要求正则表达式全模式匹配,并不是像grep那样直接写出一个局部符串的正则就可以.】

【如果你疑惑正则的用法,比如为什么转义字符‘\’有的时候像是把特殊字符转化为一般字符,有的时候又把这些字符都当做普通字符,转义的意思就变成了:hey, 把这些当做特殊符号对待!那么你就用-regextype选择一种你比较熟悉的方法吧】

8. ext4有多少行代码?

find ./fs/ext4/ -type f -regextype "posix-egrep"  -regex ".*(.h|.c)$" -exec cat {} \; | wc -l

还有一种方法是用awk做,明晚回来发

9. sed中 N 指令和 n 指令的区别用下面这个例子一目了然:

hon@hon:~/workstation/shell$ cat cu
This is 1
This is 2
This is 3
This is 4
This is 5

hon@hon:~/workstation/shell$ cat cu | sed 'N;s/\n//g;s/^.*$/&_hello/'
This is 1This is 2_hello
This is 3This is 4_hello
This is 5
hon@hon:~/workstation/shell$ cat cu | sed 'n;s/\n//g;s/^.*$/&_hello/'
This is 1
This is 2_hello
This is 3
This is 4_hello
This is 5
n在读取下一行之前把之前的行给整出模式空间打印,读取当前行,于是新读出来的行就是当前空间唯一的行了;

N在读取下一行之前不会整出之前读出来的行,所以当前空间中的数据也包括前一行捏,这个和awk的RS全局变量意义一样,

这样的话,n/N后面的sed指令是施加的内容就不一样啦!这就是区别了,貌似N的作用更大一些呢

p和P应该同理把

上一篇:sed线上经典案例之-同时替换多个字符串


下一篇:MT【307】周期数列