常用文本处理工具

grep工具

grep从标准输入或者文件中搜索出包含给定pattern的行并默认打印到标准输出,也可以进行一些其他的输出控制。grep对输入的内容的大小没有限制(受限于系统内存),并且可以匹配行中的任意字符(除换行符)。如果输入行末尾没有换行符,则grep会自动添加

grep options pattern input_file_name

如果未指定输入文件,并且使用递归选项,则grep搜索当前目录。否则grep从标准输入读取。有四个主要的grep变种,使用下面选项控制:

-G
--basic-regexp
pattern解释为标准正则表达式,这是默认行为

-E
--extended-regexp
pattern解释为扩展的正则表达式

-F
--fixed-strings
pattern解释为一系列换行分隔的固定字符串,使用字符串进行匹配

-P
--perl-regexp
pattern解释为PERL兼容的正则表达式,有些选项可能未实现

grep支持如下命令行选项:

--help
打印简短的命令行选项和bug report地址并退出

-V --version
打印出版本信息

匹配控制选项:

-e pattern
--regexp=pattern
使用pattren进行匹配查找;如果指定多个-e pattren,或者使用-f file列出多个pattern时进行查找(POSIX扩展的选项)

-f file
--file=file
文件中包含pattern每行一个,进行查找;空文件不匹配任何行(POSIX扩展的选项)

-i
-y
--ignore-case
不区分大小写,这只对ASCII字符有效(POSIX扩展的选项)

-v
--invert-match
反向匹配,取不匹配的行(POSIX扩展的选项)

-w
--word-regexp
取匹配整个单词的行;匹配整个单词意味着匹配到的子串,要么是一行的开始或者前置一个非单词组成部分,要么是一行的结束或者后置一个非单词的组成部分;单词的组成部分包括:字母、数字和下划线;如果同时指定了-x选项则这个选项无效

-x
--line-regexp
取匹配整行的行;如果pattern是正则表达式,这等同于在正则表达式的开始和结尾加上^$(POSIX扩展的选项)

一般输出控制选项:

-c
--count
输出每个给定文件中匹配到的行的数量;可以使用-v选项来输出未匹配到的行的数量

--color[=WHEN]
--colour[=WHEN]
将匹配到的字符串、匹配行、前后行、文件名、行号、字节偏移和分隔符使用可以在终端下产生颜色的转义字符序列包围。颜色使用环境变量GREP_COLORS控制,默认是ms=01;31:mc=01;31:sl=:cx=:fn=35:ln=32:bn=32:se=36,即匹配到的文本是红色加粗、文件名是品红、行号是绿色、字节偏移是蓝色、分隔符是蓝绿色、其他的是默认颜色;也可以使用GREP_COLOR环境变量控制,默认是01;31,但这个已经是过时的了。WHEN可以是never always auto

-l
--files-with-matches
打印有匹配行的文件名,扫描到第一个匹配行之后就输出这个文件名,然后接着扫描第二个文件(POSIX扩展的选项)

-m num
--max-count=num
匹配到num行之后就停止读取这个文件。如果输入是从文件获取到的标准输入,则输出匹配到的num行内容,然后grep就退出了,文件的读取位置是在最后一个匹配的行之后。如果这时文件还处于打开状态,则再次使用grep时就能从上一次读到的位置继续读,比如:

while grep -m 1 PATTERN
do
  echo xxxx
done < FILE

下面使用管道获取输入的方式就不行了:

cat FILE | while grep -m 1 PATTERN
do
  echo xxxx
done

-o
--only-matching
只显示匹配到的部分(一行可能有多个),而不是整行内容;每一个匹配到的内容在一个单独的行显示

-q
--quiet
--silent
不输出任何内容,如果有匹配到的行则返回0,否则返回1,如果文件不存在返回2并打印错误信息(POSIX扩展的选项)

-s
--no-messages
即使给定的文件不存在或者不可读也不打印任何错误(POSIX扩展的选项)

输出行前缀控制:

匹配到的行在输出时可以增加几个前缀,不论参数给定的顺序如何,输出顺序总是:文件名、行号、字节偏移

-b
--byte-offset
打印出匹配行(行开始)从文件开始的字节偏移量。如果指定-o选项则是匹配到的文本从文件开始的偏移量

-H
--with-filename
打印出匹配到行所在的文件名。如果指定多个文件则这个选项是默认行为

-h
--no-filename
不打印文件名

--label=LABEL
在显示文件名时将标准输入显示为LABEL指定的内容比如:gzip -cd foo.gz | grep --label=foo -H something

-n
--line-number
显示匹配行所在的行号,文件的首行为1(POSIX扩展的选项)

-T
--initial-tab
Make sure that the first character of actual line content lies on a tab stop, so that the alignment of tabs looks normal. This is useful with options that prefix their output to the actual content: -H, -n, and -b. In order to improve the probability that lines from a single file will all start at the same column, this also causes the line number and byte offset (if present) to be printed in a minimum-size field width.

-u
--unix-byte-offsets
显示Unix风格的字节偏移。这个选项用于在MS-DOS和MS-WINDOS平台按照Unix平台的文本格式计算字节偏移量,即\r\n换行符被忽略

-Z
--null
在控制只输出匹配行所在文件名的选项中,使用空字符(ASCII NUL字符)代替默认的文件名之间的分隔符(换行符)
Output a zero byte (the ASCII NUL character) instead of the character that normally follows a file name. For example, ‘grep -lZ’ outputs a zero byte after each file name instead of the usual newline. This option makes the output unambiguous, even in the presence of file names containing unusual characters like newlines. This option can be used with commands like ‘find -print0’, ‘perl -0’, ‘sort -z’, and ‘xargs -0’ to process arbitrary file names, even those that contain newline characters.

前后行输出控制选项:

如果指定-o选项则下面这些选项无效,并且打印出警告;无论指定任何选项组合,相同的行都不会输出多次

-A num
--after-context=num
打印出匹配行和之后的num

-B num
--before-context=num
打印匹配行和之前的num

-C num
-num
--context=num
打印匹配行和前后的num

--group-separator=string
--no-group-separator
使用string作为组分隔符(默认是--)/无组分隔符;组的意思是:如果文件中有多个匹配行则每个匹配行和前后要输出的行的内容为一个组

下面是匹配行前缀字段和行内容之间的分隔符说明:

  • 匹配行使用:作为前缀字段和行内容之间的分隔符
  • Context (i.e., non-matching) lines use - instead.
  • 如果未指定前后行,则匹配行一个接一个使用换行分隔输出
  • 如果指定前后行,则在一个组中的行使用换行分隔输出,两个组之间使用组分隔符
  • 如果两个相邻的匹配行相隔的行数小于指定的前后行数,则将两个组合为一个

文件和目录控制选项:

-D action
--devices=action
如果输入文件是一个设备、FIFO、套接字则使用action处理。如果actionread,则所有文件都当作普通文件处理;如果actionskip则这些特殊文件被跳过。这个选项对通过标准输入的文件无效

-d action
--directory=action
如果指定的文件是一个目录则使用action处理。如果actionread,则所有文件都当作普通文件读取(有些操作系统不允许读取目录文件,这样grep会报错);如果actionskip则这些特殊文件被跳过。如果actionrecure则递归的读取指定目录下的所有文件,跟随命令行中指定的符号链接但是跳过其他链接;等同于指定-r选项

--exclude=glob
跳过名字后缀匹配glob的命令行中指定的文件名;文件名后缀是指:要么匹配整个文件名,要么匹配指定文件名的basename。在递归搜索文件名时也可以使用这个选项排除basename匹配glob的文件

--exclude-from=file
file中指定多个pattern进行排除文件

--exclude-dir=glob
规则同--exclude=glob用于排除目录

--include=glob
规则同--exclude=glob用于选取匹配的文件名

-r
--recursive
根据指定的目录递归的搜索目录下的所有文件,跟随命令行中指定的符号链接,但是跳过递归搜索到的符号连接。如果未给出目录则搜索当前目录。等同于--directories=recurse选项

-R
--dereference-recursive
同上但是跟随所有符号连接

还有一些不常用的选项: -I -a --text --binary-files=type 这些选项用来处理二进制文件

其他选项:

-z
--null-data
使用空字符(ASCII NUL字符)代替换行作为默认行输出分隔符

--line-buffered
-U
--binary

详见grep手册

有一些环境变量会影响grep的行为:

GREP_OPTIONS
GREP_COLOR
GREP_COLORS
LC_ALL
LC_COLLATE
LC_CTYPE
LC_MESSAGES
LANGUAGE
LANG
详见grep手册

cut工具

命令用法:

cut -b list [-n] [file ...]
cut -c list [file ...]
cut -f list [-d delimiter][-s][file ...]

上面的-b-c-f分别表示字节、字符、字段(即byte、character、field)

list表示-b-c-f操作范围,-n常常表示具体数字

-d指定字段分隔符,默认情况下为TAB

-s表示不包括那些不含分隔符的行(这样有利于去掉注释和标题)

--output-delimiter="---" 输出分隔符

file表示的是要操作的文本文件的名称,为空或者用-代替表示从标准输入读取

范围的表示方法:

n               表示只有第n项
n-              表示从第n项到行尾
n-m             从第n项到第m项
-m              从第一行开始到第m项
-               从一行的开始到结束所有项

sort工具

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

sort [OPTION]... [FILE]...
sort [OPTION]... --files0-from=F


sort -n   //以数值排序 numeric
sort -u   //去掉排序内容中的重复项目
sort -r   //反向排序
sort file.txt -o file.txt        //将排序后的结果输入到另外一个文件,可以输入到原文件,用>不可以
sort -t delimiter -k colnumber[nr] -k colnum[nr]   //用-t指定的分隔符分割每行文本,以-k指定的字段排序,可以用多个-k处理相同的行,k后面可以加nr等选择项

-f, --ignore-case
会将小写字母都转换为大写字母来进行比较,亦即忽略大小写

-c, --check, --check=diagnose-first
会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1

-C, --check=quiet, --check=silent
会检查文件是否已排好序,如果乱序,不输出内容,仅返回1

-M, --month-sort
会以月份来排序,比如JAN小于FEB等等 [month]

-b, --ignore-leading-blanks
会忽略每一行前面的所有空白部分,从第一个可见字符开始比较

-g, --general-numeric-sort
以一般数值排序 [general-numeric]

-i, --ignore-nonprinting
忽略不可打印字符

-h, --human-numeric-sort
比较数值时考虑数值后面的计算机单位(2k,1G) [human-numeric]

-R, --random-sort
按Hash值进行排序,随机排序 [random]

--random-source=FILE 从文件中获取随机的字节
--sort=WORD 根据WORD指定的值进行排序,WORD包括:general-numeric human-numeric month numeric random version

其他的选项的详细信息请参考man page

uniq工具

uniq [OPTION]... [INPUT [OUTPUT]]

对从INPUT或者标准输入得到的数据行进行过滤,写入OUTPUT;对相邻并且重复的行进行处理(可以先使用sort对文件行进行排序);默认不指定选项时,将相邻并且重复的行只输出一次

常用选项:

-c, --count
在每行旁边显示该行重复出现的次数

-d, --repeated
仅显示重复出现的行

-u, --unique
仅显示出现一次的行

-i, --ignore-case
在判断重复行时,忽略大小写区别

-D, --all-repeated[=method] 以指定的格式打印所有重复的行。格式仅适用于长选项参数,可使用none(默认),prependseparate三个

-f n, --skip-fields=n 前n个字段与每个字段前的空白一起被忽略。一个字段(fields)是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从1开始编号)。与-n相同,n为字段数。

-s n, --skip-chars=n 前n个字符被忽略,之前的字符被跳过(字符从1开始编号)。与+n相同,n为字符数。

-w n, --check-chars=n
仅比较每行前面n个字符

--help
显示帮助信息

--version
显示版本信息

comm工具

按行比较两个排序过的文件

comm [OPTION]... FILE1 FILE2

没有指定option的话,产生三列输出,第一列输出只在file1中的行,第二列输出只在第二个文件中的行,第三列输出两个文件中都包含的行

-1    不输出第一列(只在文件1中的行)
-2    不输出第二列(只在文件2中的行)
-3    不输出第三列(同时在文件1和文件2中的行)
--check-order       check that the input is correctly sorted, even if all input lines are pairable
--nocheck-order     do not check that the input is correctly sorted
--output-delimiter=STR      separate columns with STR
--help display this help and exit
--version

   Note, comparisons honor the rules specified by `LC_COLLATE`.

EXAMPLES
comm -12 file1 file2
Print only lines present in both file1 and file2
comm -3
file1 file2 Print lines in file1 not in file2, and vice versa.

wc工具

统计FILEnewline word char byte的数量并打印;如果不指定文件或者文件名是-则表示从标准输入获取内容。word表示空格分隔的非空连续的字符。不管使用哪个控制选项输出总是按:行数、字数、字符数、字节数和最长行

wc [OPTION]... [FILE]...
wc [OPTION]... --files0-from=F

-c, --bytes
字节统计

-m, --chars
字符统计

-l, --lines
行数统计

-w, --words
字数统计

-L, --max-line-length
输出最长行

--files0-from=F
--help
--version

tee工具

join工具

seq工具

tr工具

diff工具

colunm工具

col工具

坚持原创技术分享,您的支持将鼓励我继续创作!