Linux文本操作命令

linux文本操作就是对文件的内容进行管理,具体的操作有:wc(统计)、cut(切分)、sort(排序)、uniq(去重)、grep(查找)、sed(替换、插入、删除)、awk(文本分析)。这里重点讲述上述命令。

grep

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep适合单纯的查找和匹配文本。

Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

grep常用用法

命令格式:grep [option] pattern file
参数:

Miscellaneous:
  -s, --no-messages         suppress error messages
  -v, --invert-match        select non-matching lines
  -V, --version             display version information and exit
      --help                display this help text and exit
Output control:
  -m, --max-count=NUM       stop after NUM matches
  -b, --byte-offset         print the byte offset with output lines
  -n, --line-number         print line number with output lines
      --line-buffered       flush output on every line
  -H, --with-filename       print the filename for each match
  -h, --no-filename         suppress the prefixing filename on output
      --label=LABEL         print LABEL as filename for standard input
  -o, --only-matching       show only the part of a line matching PATTERN
  -q, --quiet, --silent     suppress all normal output
      --binary-files=TYPE   assume that binary files are TYPE;
                            TYPE is `binary', `text', or `without-match'
  -a, --text                equivalent to --binary-files=text
  -I                        equivalent to --binary-files=without-match
  -d, --directories=ACTION  how to handle directories;
                            ACTION is `read', `recurse', or `skip'
  -D, --devices=ACTION      how to handle devices, FIFOs and sockets;
                            ACTION is `read' or `skip'
  -R, -r, --recursive       equivalent to --directories=recurse
      --include=FILE_PATTERN  search only files that match FILE_PATTERN
      --exclude=FILE_PATTERN  skip files and directories matching FILE_PATTERN
      --exclude-from=FILE   skip files matching any file pattern from FILE
      --exclude-dir=PATTERN  directories that match PATTERN will be skipped.
  -L, --files-without-match  print only names of FILEs containing no match
  -l, --files-with-matches  print only names of FILEs containing matches
  -c, --count               print only a count of matching lines per FILE
  -T, --initial-tab         make tabs line up (if needed)
  -Z, --null                print 0 byte after FILE name

grep正则表达式

参数:

Regexp selection and interpretation:
  -E, --extended-regexp     PATTERN is an extended regular expression (ERE)
  -F, --fixed-strings       PATTERN is a set of newline-separated fixed strings
  -G, --basic-regexp        PATTERN is a basic regular expression (BRE)
  -P, --perl-regexp         PATTERN is a Perl regular expression
  -e, --regexp=PATTERN      use PATTERN for matching
  -f, --file=FILE           obtain PATTERN from FILE
  -i, --ignore-case         ignore case distinctions
  -w, --word-regexp         force PATTERN to match only whole words
  -x, --line-regexp         force PATTERN to match only whole lines
  -z, --null-data           a data line ends in 0 byte, not newline

匹配模式:
'.'         匹配任意单一字符
X*       与包含连续0个或多个字符X的行匹配 
X+       与包含连续1个或多个字符X的行匹配 
[a-z]    与包含a-z的其中一个字符的行匹配
[^a-z]   与不包含a-z的其中一个字符的行匹配
[0-9]    与包含0-9的其中一个字符的行匹配
^hello   与以字串hello起始的行匹配
hello$   与以字串hello结束的行匹配
\          转义字符,后跟特殊字符,可表示它本来的涵义
\d        匹配一个数字字符. 等价于 [0-9]
\D       匹配一个非数字符. 等价于 [^0-9]
\w       等价于 "[A-Za-z0-9_]"
\W      匹配任何非单词字符,等价于 "[^A-Za-z0-9]"
\s        匹配任何空白字符, 包括空格 制表符 换页符 等等. 等价于[\f\n\r\t\v]
\S       匹配任何非空白字符. 等价于 [^\f\r\n\t\v]
\b       匹配一个单词边界,也就是指单词和空格间的位置。
\B       匹配非单词边界。

示例

使用正则表达式

$grep -c "^$" filename  #对文件中的空行计数
$grep  ".*hello" filename  #查找在“hello”有任意长度字串的行 
$grep "hi \+hello" filename  #查找在'hi'与'hello'之间至少有一个空格的行
$grep "hi *hello" filename  #查找在'hi'与'hello'之间没有空格或有多个空格的行
$grep "hi \?hello" filename  #查找在'hi'与'hello'之间没有空格或有1个空格的行
$grep "127\.0\.0\.1"  filename  #查找ip地址127.0.0.1 (其中包含特殊字符 '.')

$grep -n '[^g]oo' filename  #搜索到有 oo 的行,但不想要 oo 前面有 g
$grep -n '[^a-z]oo' filename  #oo 前面不想要有小写字节
$grep -n '[0-9]' filename  #取得有数字的那一行

$grep -n '^the' filename  #让 the 只在行首列出
$grep -n '^[a-z]' filename  #开头是小写字母
$grep -n '^[^a-zA-Z]' filename  #开头不是小写字母
$grep -n '\.$' filename  #行尾以小数点结束
$grep -n '^$' filename  #空白行

$grep -n 'g..d' filename  #找出 g??d 的字串,亦即共有四个字节, 起头是 g 而结束是 d 
$grep -n 'ooo*' filename  #找出至少两个 o 以上的字串
$grep -n 'goo*g' filename  #字串开头与结尾都是 g,但是两个 g 之间仅能存在至少一个 o ,亦即是 gog, goog, gooog.... 等等
$grep -n 'g.*g' filename  #找出 g 开头与 g 结尾的行,当中的字符可有可无
$grep -n '[0-9][0-9]*' filename  #找出任意数字的行

$grep -n 'o\{2\}' filename  #找到两个 o 的字串
$grep -n 'go\{2,5\}g' filename  #找出 g 后面接 2 到 5 个 o ,然后再接一个 g 的字串
$grep -n 'go\{2,\}g' filename  #2 个 o 以上的 goooo....g

#egrep
$egrep 'NW|EA' filename  #打印所有包含NW或EA的行,或$grep -F 'NW|EA' filename
$grep 'NW\|EA' filename  #对于标准grep,如果在扩展元字符前面加\,grep会自动启用扩展选项-E。

#fgrep
$fgrep  '*' /etc/profile  #在文件或者输出中找到包含星号字符的行,或$grep -F  '*' /etc/profile

匹配行

# 匹配包含root的行
$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:991:989:Docker User:/var/lib/docker:/sbin/nologin

# 匹配包含root的行,并显示行数
$ grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
42:dockerroot:x:991:989:Docker User:/var/lib/docker:/sbin/nologin

# 将/etc/passwd没有出现root的行取出来
$ grep -v root /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
...
jipeng:x:1000:1000:jipeng:/home/jipeng:/bin/bash
opensips:x:990:988:OpenSIPS SIP Server:/var/run/opensips:/sbin/nologin

# 将/etc/passwd,没有出现root和nologin的行取出来
$ grep -v root /etc/passwd | grep -v nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
amandabackup:x:33:6:Amanda user:/var/lib/amanda:/bin/bash
jipeng:x:1000:1000:jipeng:/home/jipeng:/bin/bash

在目录中查找

​# grep hello *           #在当前目录搜索带hello行的文件
# grep -r hello *        #在当前目录及其子目录下搜索hello行的文件
# grep -l -r hello *     #在当前目录及其子目录下搜索hello行的文件,但是不显示匹配的行,只显示匹配的文件

linux grep命令详解 
如何使用Unix/Linux grep命令 

awk

awk适合对文本进行较复杂格式处理。

Linux awk命令

sed

sed适合编辑匹配到的文本。

Linux sed命令

sort

sort是linux下的一个排序命令, 它将比较文件的每一行,在比较每行时,从每行的首字符开始,比较ASCII值,然后升序输出。其有如下选项。

-b   忽略每行前面开始出的空格字符;
-c   检查文件是否已经按照顺序排序;
-d   排序时,处理英文字母、数字及空格字符外,忽略其他的字符;
-f    排序时,将小写字母视为大写字母;
-i    排序时,除了040至176之间的ASCII字符外,忽略其他的字符;
-m   将几个排序号的文件进行合并;
-M   将前面3个字母依照月份的缩写进行排序;
-n   依照数值的大小排序;
-r   以相反的顺序来排序;
-o<输出文件>    将排序后的结果存入制定的文件;
-t<分隔字符>    指定排序时所用的栏位分隔字符;
+<起始栏位>-<结束栏位>   以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。

linux sort 命令详解

uniq

该命令用于检查并删除文本中重复出现的行列。一般与sort命令结合使用。

-c或–count          在每列旁边显示该行重复出现的次数。
-d或–repeated     仅显示重复出现的行列。
-f<栏位>或–skip-fields=<栏位>               忽略比较指定的栏位。
-s<字符位置>或–skip-chars=<字符位置>  忽略比较指定的字符。
-u或–unique         仅显示出一次的行列。
-w<字符位置>或–check-chars=<字符位置> 指定要比较的字符。

$ cat testfile
test 30
test 30
test 30
Hello 95
Hello 95
Hello 95
Hello 95
Linux 85
Linux 85

# 删除重复行后的内容
$ uniq testfile
test 30
Hello 95
Linux 85

# 删除文件中出现的重复行,并在行首显示该行重复出现的次数
$ uniq -c testfile
      3 test 30
      4 Hello 95
      2 Linux 85

# 统计各行在文件中出现的次数
$ sort testfile | uniq -c
      4 Hello 95
      2 Linux 85
      3 test 30

# 删除重复的行
$ sort testfile | uniq -d
Hello 95
Linux 85
test 30

cut

wc

三大文本处理工具grep、sed及awk的简单介绍 
[Linux] Linux常用文本操作命令整理