Linux 文本处理 grep、sed、awk (Text-processing Utilities)

教程

三者的区别(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 的处理分为 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值