教程
三者的区别(Difference Between grep, sed, and awk):
- grep is only good for simple text matching and printing.
- In addition to match and print text, sed offers additional text transformation commands like substitution.
- awk, being the most powerful of these tools, is a scripting language that offers a multitude of features that do not exists in the former two.
GREP
SED (Stream EDitor)
AWK
- AWK Tutorial
- AWK - Regular Expressions
- How to use regular expressions in awk
- 8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR
awk 的处理分为 BEGIN、处理文本(读入一行处理一行,循环)、END 三个 blocks。
注意 awk 的内置变量/关键字(built-in variables),比如 ARGC、ARGV、FS、OFS、RS、ORS、NF、NR、FNR、FILENAME 等的含义和用法。NF 是一行中 fields 的数量,NR 是行数(行号)。
awk 的运算符(operators)和 C++ 类似。字符串连接(string concatenation operators)和正则匹配符(regular expression operators)比较特殊,字符串连接用空格(space),正则匹配用 ~
。
awk 的正则表达式的内容单独表示在 //
两个斜杠之中。和 Python 常用的正则语法类似。
awk 的 if、while、for 等的用法和 C++ 类似。
awk 有一些很有用的内置函数(built-in functions),用户也可以自定义函数(user-defined functions)。
案例
1. 统计行数
grep -c "" filename
sed -n '$=' filename
awk 'END{print NR}' filename
2. 提取部分行
sed -n "5p" filename # 提取第5行
sed -n "1,20p" filename # 提取1-20行
3. 打印空行行号
空行的正则表达式为 ^\s*$
或 ^$
。其中 \s
表示空格。
grep -n '^\s*$' filename | awk -F ":" '{print $1}'
sed -n '/^\s*$/=' filename
awk '/^\s*$/{print NR}' filename
4. 打印非空行
grep -v '^\s*$' filename
sed '/^\s*$/d' filename
awk '$0!~/^\s*$/{print $0}' filename
5. 去掉不需要的单词
grep -v [Bb] filename # 去掉包含 B 或 b 的单词
sed '/[Bb]/d' filename
awk '$0!~/[Bb]/{print $0}' filename
6. 筛选一定长度的单词
awk -F ' ' '{for(i=1;i<NF;i++){if(length($i)<8){print $1}}}' filename
7. 求和
awk '{sum+=$1}END{print sum}' filename
8. 求平均值
awk '{if(NR==1){number=$0} else{sum+=$0}}END{printf("%.3f",sum/number)}' filename
9. 统计词频
awk '{for(i=1;i<NF;i++) a[$i]+=1}END{for(x in a) print x,a[x]}' filename
可以配合 sort
进行排序
10. 行列转置
awk '{
for(i=1;i<=NF;i++){
if(NR==1){
row[i]=$i;
}else{
row[i]=row[i]" "$i;
}
}
}END{
for(i=1;i<=NF;i++){
print row[i];
}
}' filename