Linux文本处理常用命令

Linux文本处理常用命令:grep、sed、printf、awk、cut、sort

1. grep

按行查找字符,输出包含字符的行
用法

  1. grep ‘key’ test.txt
  2. cat test.txt|grep ‘key’
参数 含义及示例
-n 输出结果加行号
–color=auto 匹配的关键字高亮显示
-A2 输出匹配行的后两行
-B2 输出匹配行的前两行
-v 反向查找,即输出不包含关键字的行
-i 关键字匹配时忽略关键字大小写

例如:

1
grep 'o\{3\}'  //查找两个o,这里需要注意,{}在shell里有特殊意义,因此需要转义。

egrep:

正则表达式分为基本正则表达式和扩展正则表达式,grep只支持基本正则表达式,如果要使用扩展正则表达式,需要使用egrep命令
列如:

1
2
3
egrep '123|1234' //查找123或1234
egrep '1(23|234)5' //查找1235或12345
egrep '1(23)+45' //查找1X45,其中X是一个或一个以上的‘23’字符串

2.sed

sed可以用来做行删除、行新增、行选取、行替换、字符串替换
使用方式:cat test.txt | sed ‘2d’ 或者 sed ‘2d’test.txt

  1. 行删除
    sed ‘2,5d’ //删除第2-5行
    sed ‘3,$d’ //删除第3到最后一行
    sed ‘/^$/d’//删除空行
  2. 行新增
    sed ‘2a abc’ //在第二行下面追加一行“abc”,a代表append
    sed ‘2i abc’ //在第二行上面插入一行 “abc”,i代表insert
    sed ‘2a a\
    b\
    c’  //在第二行下面追加三行 “a”、”b”、”c”,只需要每行结尾加”\”即可。
  3. 行选取
    sed -n ‘7,9p’  //选取第5到7行输出,必须加-n参数,不然效果就是所有行都被输出,而7到9行输出两次。
  4. 行替换
    sed ‘2,5c abc’  //将第2到5行替换为一行字符串”abc”
  5. 字符串替换
    sed ‘s/要被替换的字符串/新的字符串/g’ /可以是#号之类的,在被替换的字符串包含/时,可以考虑别的分隔符。要被替换的字符串可以是
    正则表达式

注意:

1
2
3
4
5
6
7
8
9
10
操作特定区间或规则的行
sed '8,$s/aa/AA/g' test.txt 对第8行到文件末尾的所有行进行搜索替换操作
sed '/^[0-9]/s/aa/AA/g' test.txt 正则表达式表示对所有以数字开头的行,执行s操作

sed的正则中 \(\) 和 \{m,n\} 需要转义
. 表示任意字符
* 表示零个或者多个
\+ 一次或多次  
\? 零次或一次
\| 表示或语法

3. printf

格式化并打印数据
printf ‘%10s %10s %10s %10s %10s \n’ cat test.txt %10s代表这一列的宽度固定为10个字符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐)

4. awk

NF :每一行分隔后的列数
NR :行号
FS=”,”:以”,”分割行
cat test.txt |awk ‘NR==1 {printf “%10s %10s %10s %10s %10s \n”,$1,$2,$3,$4,”Total”};NR>1 {printf “%10s %10s %10s %10s %10s \n”,$1,$2,$3,$4,$2+$3+$4}’

  1. 加入条件判断后,awk的格式为: awk ‘条件1 {命令1};条件2{命令2}’
  2. 条件判断有以下逻辑运算:

    1
    2
    3
    4
    5
    6
    >
    <
    >=
    <=
    ==  //注意判断相等要用两个等号
    !=
  3. 可以直接运算行内列的值($1、$2、$3)。

5. 其他

1)cut切割字符

  • 以“,”切割文件并取出第1列
    cat test.txt |cut -d ‘,’ -f 1| sort | uniq -c | sort -rn -k1 > new_test.txt

2)sort排序的时候注意默认是按照字典的方式排序,如果按照数字时则必须加上-n

  • uniq去除重复,只能去除相邻的重复,所以要先排序,后去除重复
命令 用途
grep/egrep 关键字查找
sed 1.行的删除、添加、替换、选取
2.关键字替换
printf 文本格式化输出
awk 1. 将每行按分隔符拆分成列并选取某些列
2. 通过逻辑判断对不同行进行不同的处理
3.对一行中的几列数值进行计算
cat 切割字符
sort 排序