Linux的文本处理工具(一)

在linux上操作时,熟悉几个shell命令是必不可少的技能,比如grep,sed,sort等。下面以几个例子来说明几种常见的用法

grep

grep是Linux中强大的文本搜索工具,用其来查找文本是相当方便的

grep命令格式为:

grep [OPTION] PATTERN [FILE]

常用选项:

-A : 除了显示匹配上的行外,并显示该行之后的内容,可以理解为after
-B : 除了显示匹配上的行外,并显示该行之前的内容,可以理解为before
-c : 输出时显示匹配上的行的计数
-E : 可使用扩展正则表达式来匹配
-F : 用于查找固定字符串
-i : 忽视大小写的匹配
-n : 标示出匹配上的行数的行编号
-v : 只输出那些没有匹配上的行
-o : 只输出匹配上的那部分内容
-w : 只匹配整个单词
-a : 对二进制文件以text形式匹配

常见用法:

  1. 匹配固定字符串

    grep -F pattern abc.txt
    
  2. 输出没有匹配上pattern的行

    grep -v pattern abc.txt
    
  3. 输出匹配上pattern行的行数

    grep -n pattern abc.txt
    
  4. 搜索目录,并且是递归搜索,比如递归搜索当前目录

    grep -r pattern .
    
  5. 使用扩展正则匹配来搜索能匹配上pattern连续重复的行

    grep -E '(pattern)+' abc.txt
    
  6. 匹配多个字符串

    grep -e "aaa" -e "bbb" 
    
  7. 只在目录中所有的.php和.html文件中递归搜索字符”main()”,这个非常棒

    grep "main()" . -r --include *.{php,html} 
    

sed

sed 是一个精简的、非交互式的编辑器,它能执行与编辑vi相同的编辑任务。比如在一个流程中,我只想出去一个文件中所有的星号,这时一般不可能写脚本,这时sed就是个非常有效的方法

sed命令行格式为:

sed [-nefri]  ‘command’  输入文本/文件        

常用选项:

-n : 取消默认的输出,使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来
-e : 进行多项编辑,即对输入行应用多条sed命令时使用. 直接在指令列模式上进行 sed 的动作编辑
-f : 指定sed脚本的文件名. 直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作
-r : sed 的动作支援的是延伸型正则表达式的语法。(预设是基础正则表达式语法)
-i : 直接修改读取的文件内容,而不是由屏幕输出      

常用命令:

a : 新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c : 取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d : 删除,因为是删除,所以 d 后面通常不接任何内容
i : 插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
p : 列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起用
s : 取代,可以直接进行替换的工作。通常这个 s 的动作可以搭配正则表达式。

常见用法:

  1. 替换文本中所有的星号为空,并不在屏幕输出

    sed -i 's//\*/g' abc.txt
    
  2. 替换文本中第3个匹配上的pattern为other

    sed 's/pattern/other/3' abc.txt
    
  3. 打印发生替换的行

    sed -n 's/pattern/pattern/p' abc.txt
    
  4. 打印文本的10-20行

    sed -n '10,20p' abc.txt
    
  5. 替换能匹配到for的行中的pattern字符串为空

    sed '/for/ s//pattern/g' abc.txt
    
  6. 替换能匹配for到end的所有行中的pattern字符串为空

    sed '/for/,/end/ s//pattern/g' abc.txt
    
  7. 删除空白行

    sed '/^$/d' abc.txt
    
  8. 删除第2-10行

    sed '2,10d' abc.txt
    
  9. 删除已The开头的的行

    sed '/^The/'d abc.txt
    
  10. 直接修改在匹配到end的行的后面追加This is end

    sed -i '/end/a\this is end' abc.txt
    

sort

sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

sort命令格式:

sort 选项 参数

常用选项:

-u 它的作用很简单,就是在输出行中去除重复行,只保留其中的第一条。
-r sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。
-o 将排序后的结果写入原文件
-n 使用-n选项,来告诉sort,“要以数值来排序”!
-t和-k sort提供了-t选项,后面可以设定间隔符,指定了间隔符之后,就可以用-k来指定列数了
-c 检查文件是否已经排序
-b 忽略每行开头的空格字符,从第一个可见字符开始比较
-f 忽视大小写进行排序

常见用法:

  1. 简单的排序

    sort abc.txt
    
  2. 对文本进行冒号分割后的第2列进行排序

    sort -t: -k2 abc.txt
    
  3. 对文本进行冒号分割,然后先对第2列进行数值排序,如果相同在根据第3列进行数值排序

    sort -t: -k2n -k3n abc.txt
    
  4. 如需排序后去重复,可以搭配uniq一起使用,如排序去重后并计数

    sort abc.txt |uniq -c
    
  5. 排序后去重并显示重复项

    sort abc.txt |uniq -d
    
  6. 排序后去重并显示不重复项

    sort abc.txt |uniq -u
    

补充:shuf命令:随机排序文件

-n 最多显示多少行
-o 将随机排序后的输出写到一个文件中

例子:

shuf test.txt | head -n 20

参考:
http://man.linuxde.net/
http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html
https://github.com/stephenturner/oneliners