文章目录

  • 常用选项
  • 元字符
  • 示例
  • wc命令
  • cut命令
  • sort 命令
  • uniq 命令


grep 是用途最广泛的文本搜索匹配工具,它根据用户指定的模式过滤条件对目标文本进行匹配检查,并输出匹配到的行。

格式:

grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN]...  [-f FILE]...  [FILE...]

grep、egrep和fgrep的区别在于默认使用的正则表达式模式集的不同,并且是可以通过参数互相转换的。

参数

作用

-E, --extended-regexp

支持使用扩展正则表达式,和egrep相同

-G, --basic-regexp

支持基本的正则表达式,默认模式

-F, --fixed-strings

匹配固定字符串,不支持元字符,和fgrep

常用选项

参数

作用

-b

将可执行文件(binary)当作文本文件(text)来搜索

-c

统计匹配到的行数并输出

-C #

显示匹配行的上下文,-C 2表示显示匹配行,及匹配行的前后各两行

-A #

-A 2显示匹配行,及匹配行之前两行

-B #

-B 2显示匹配行,及匹配行之后两行

-i,–ignorecase

忽略字符的大小写

-n

对输出的匹配结果,显示行号

-q,–quiet

静默模式,不输出匹配结果

-v, --invert-match

反向选择,输出不被匹配的行

-o

只输出匹配到的字符串本身

元字符

grep 不支持非贪婪模式

说明

基本正则表达式

扩展正则表达式

锚定行首

^

^

锚定行尾,例如 ^$匹配空行,^[[:space]]$匹配有空白字符的行

$

$

单词锚定1,又叫匹配单词边界

这里单词是指由非特殊字符组成的连续字符串

开头:\<结尾:\<

开头:\<结尾:\<

单词锚定2,又叫匹配单词边界

这里单词是指由非特殊字符组成的连续字符串

开头和结尾都是\b

开头和结尾都是\b

匹配非单词边界,例如:‘er\B’ 能匹配 “verb” 中的’er’,但不能匹配"never" 中的’er’

\B

\B

匹配子表达式 m次,m 必须是一个 0 或者正整数

\{m\}

{m}

匹配子表达式大于等于 m次,m 必须是一个 0 或者正整数,

\{m,\}

{m,}

匹配子表达式大于n次小于m次,mn必须是一个 0 或者正整数,

\{m,n\}

{n,m}

匹配前面的子表达式 0 次或多次(等价于{0, })

*

*

匹配前面的子表达式 1 次或多次(等价于{1, })

\+

+

匹配前面的子表达式 0 次或 1 次(等价于{0,1})

\?

匹配除换行符\n之外的任意单个字符

.

.

匹配列出字符中的任意一个

[]

[]

匹配未列出字符中的任意一个

注意这里不是不匹配,例如[^abc]意思是匹配任意一个不是ab或者c的字符

[^]

[^]

匹配任何非单词字符 (等价于[^A-Za-z0-9_])

\W

\W

匹配包括下划线的任何单词字符(等价于[A-Za-z0-9_]

\w

\w

匹配转义字符本身

\\

\\

分组匹配

\(\)

()

分组匹配中的引用

分组匹配模式匹配到的字符会被记录在正则表达式引擎的内部变量中,这些变量使用\1\2\3等表示引用

不支持

\num

匹配 x 或 y,例如: C|cat表示C或者cat(C|c)at表示Cat或者cat

x\|t

x|y

元字符

代表的意思

[:alnum:]

匹配任何一个字母或数字([A-Za-z0-9])

[:alpha:]

匹配任何一个字母([A-Za-z])

[:digit:]

匹配任何一个数字([0-9])

[:lower:]

匹配任何一个小写字母([a-z])

[:upper:]

匹配任何一个大写字母([A-Z])

[:space:]

任何一个空白字符: 支持制表符、空格,例如:’ [[:space:]] ’

[:blank:]

空格和制表符(横向和纵向),例如:’[[:blank:]]‘ó’[\s\t\v]’

[:graph:]

任何一个可以看得见的且可以打印的字符(注意:不包括空格和换行符等),例如:’[[:graph:]] ’

[:print:]

任何一个可以打印的字符(注意:不包括:[:cntrl:]、字符串结束符’\0’、EOF 文件结束符(-1), 但包括空格符号),例如:’[[:print:]] ’

[:cntrl:]

任何一个控制字符(ASCII 字符集中的前 32 个字符,即:用十进制表示为从 0 到31,例如:换行符、制表符等等),例如:’ [[:cntrl:]]’

[:punct:]

任何一个标点符号(不包括:[:alnum:]、[:cntrl:]、[:space:]这些字符集)

[:xdigit:]

任何一个十六进制数(即:0-9,a-f,A-F)

示例

  1. 显示/etc/passwd文件中,不以/bin/bash结尾的行
grep -vE "/bin/bash$" /etc/passwd
  1. 找出/etc/passwd文件中包含两位数或者三位数的行
grep -E "\<[0-9]{2,3}\>" /etc/passwd
  1. 找出/etc/profile文件中,以至少一个空白字符开头,且以非空字符结尾的行
grep -E "^[[:space:]]+[^[:space:]]+$" /etc/profile
  1. 找出netstat -tan命令结果中,以LISTENLISTEN后跟1个或者多个空白字符结尾的行
netstat -tan | grep -E "LISTEN[[:space:]]*$"
  1. 显示当前系统中root或者mysql用户的相关信息
grep -E "^(root|mysql)\>" /etc/passwd
#root:x:0:0:root:/root:/bin/bash
#mysql:x:117:125:MySQL Server,,,:/nonexistent:/bin/false
  1. 找出/etc/rc.d/init.d/functionscentos上有)文件中,某个单词后面跟一个小括号的行
grep -E "\<[[:alpha:]]+\>\(\)" /etc/rc.d/init.d/functions
  1. 找出ifconfig命令结果中的1-255的数值。
ifconfig | grep -E "\b[1-9][0-9]{0,1}\b||\<1[0-9]{2}\>|\<2([0-4][0-9]|5[0-5])\>"
  1. 找出ifconfig命令中的ip地址
ifconfig | grep -E "((\b[0-9]\b|\b[1-9][0-9]{0,1}\b||\<1[0-9]{2}\>|\<2([0-4][0-9]|5[0-5])\>)\.){3}(\b[0-9]\b|\b[1-9][0-9]{0,1}\b||\<1[0-9]{2}\>|\<2([0-4][0-9]|5[0-5])\>)"
  1. 添加用户bashtestbashnologin(设置shell/sbin/nologin),然后找出/etc/passwd文件中用户名同shell名的行。
sudo useradd bash
sudo useradd testbash
sudo useradd nologin -s /sbin/nologin

grep -E "^([[:alnum:]]+\>).*\1$" /etc/passwd

wc命令

Linux wc命令用于计算字数。

利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为-,则wc指令会从标准输入设备读取数据。

wc [-clw][--help][--version][文件...]

参数

作用

-c ,–bytes , --chars

只显示Bytes数

-l , --lines

只显示行数

-w ,–words

只显示字符数

在默认的情况下,wc将计算指定文件的行数、字数,以及字节数。使用的命令为:

wc /etc/profile
74  188 1779 /etc/profile  # 表示/etc/profile 文件有 74 行,188 个单词,1779 个字节

wc -l /etc/profile
# 74 /etc/profile
wc -w /etc/profile
# 188 /etc/profile
wc -c /etc/profile
# 1779 /etc/profile

wc testfile testfile_1 testfile_2   #统计三个文件的信息 

3 92 598 testfile                    #第一个文件行数为3、单词数92、字节数598  
9 18 78 testfile_1                   #第二个文件的行数为9、单词数18、字节数78  
3 6 32 testfile_2                    #第三个文件的行数为3、单词数6、字节数32  
15 116 708 总用量                    #三个文件总共的行数为15、单词数116、字节数708

cut命令

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

cut  [-bn] [file]
cut [-c] [file]
cut [-df] [file]

参数

作用

-b

以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。

-c

以字符为单位进行分割。

-d

自定义分隔符,默认为制表符。若指定空格做为分隔符,需要用引号引起来

-f

与-d一起使用,指定显示哪个区域。值有三种格式

#指定字段

#-#指定连续字段

#,#指定离散字段

#,#-#,#,# 以上三种方式可以混用

示例:获取所有 用户的 id 号

cut -d: -f 3 /etc/passwd
74
89
998
1000
997
996
995
...

sort 命令

Linux sort命令用于将文本文件内容加以排序。可针对文本文件的内容,以行为单位来排序。

sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]

参数

作用

-b

忽略每行前面开始出的空格字符。

-c

检查文件是否已经按照顺序排序。

-d

排序时,处理英文字母、数字及空格字符外,忽略其他的字符。

-f

排序时,忽略大小写。

-o

<输出文件> 将排序后的结果存入指定的文件。

-r

以相反的顺序来排序。

-n

依照数字的大小排序。

-t

指定排序时所用的栏位分隔字符。

-k

-t用指定分隔符分割行之后,-k指定用于排序的列

-u

意味着是唯一的(unique),输出的结果是去完重了的。

示例:统计/etc/passwd中使用了多少种shell类型

cut -d: -f7 /etc/passwd | sort -u | wc -l

uniq 命令

Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。

uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]

以下内容来自菜鸟教程

参数

作用

-c , --count

每列旁边显示该行重复出现的次数。

-d,–repeated

仅显示分组结果中,出现 2 次及以上的行

-u,–unique

仅显示统计结果为1的行

testfile中的原有内容为:

$ cat testfile      #原有内容  
test 30  
test 30  
test 30  
Hello 95  
Hello 95  
Hello 95  
Hello 95  
Linux 85  
Linux 85

使用uniq 命令删除重复的行后,有如下输出结果:

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

检查文件并删除文件中重复出现的行,并在行首显示该行重复出现的次数。使用如下命令:

uniq -c testfile

结果输出如下:

$ uniq -c testfile      #删除重复行后的内容  
3 test 30             #前面的数字的意义为该行共出现了3次  
4 Hello 95            #前面的数字的意义为该行共出现了4次  
2 Linux 85            #前面的数字的意义为该行共出现了2次