文章目录
- 常用选项
- 元字符
- 示例
- wc命令
- cut命令
- sort 命令
- uniq 命令
grep 是用途最广泛的文本搜索匹配工具,它根据用户指定的模式过滤条件对目标文本进行匹配检查,并输出匹配到的行。
格式:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN]... [-f FILE]... [FILE...]
grep、egrep和fgrep的区别在于默认使用的正则表达式模式集的不同,并且是可以通过参数互相转换的。
参数 | 作用 |
-E, --extended-regexp | 支持使用扩展正则表达式,和 |
-G, --basic-regexp | 支持基本的正则表达式,默认模式 |
-F, --fixed-strings | 匹配固定字符串,不支持元字符,和 |
常用选项
参数 | 作用 |
-b | 将可执行文件(binary)当作文本文件(text)来搜索 |
-c | 统计匹配到的行数并输出 |
-C # | 显示匹配行的上下文, |
-A # |
|
-B # |
|
-i,–ignorecase | 忽略字符的大小写 |
-n | 对输出的匹配结果,显示行号 |
-q,–quiet | 静默模式,不输出匹配结果 |
-v, --invert-match | 反向选择,输出不被匹配的行 |
-o | 只输出匹配到的字符串本身 |
元字符
grep 不支持非贪婪模式
说明 | 基本正则表达式 | 扩展正则表达式 |
锚定行首 |
|
|
锚定行尾,例如 |
|
|
单词锚定1,又叫匹配单词边界 这里单词是指由非特殊字符组成的连续字符串 | 开头: | 开头: |
单词锚定2,又叫匹配单词边界 这里单词是指由非特殊字符组成的连续字符串 | 开头和结尾都是 | 开头和结尾都是 |
匹配非单词边界,例如:‘er\B’ 能匹配 “verb” 中的’er’,但不能匹配"never" 中的’er’ | \B | \B |
匹配子表达式 |
|
|
匹配子表达式大于等于 |
|
|
匹配子表达式大于 |
|
|
匹配前面的子表达式 0 次或多次(等价于{0, }) |
|
|
匹配前面的子表达式 1 次或多次(等价于{1, }) |
|
|
匹配前面的子表达式 0 次或 1 次(等价于{0,1}) |
|
|
匹配除换行符 |
|
|
匹配列出字符中的任意一个 |
|
|
匹配未列出字符中的任意一个 注意这里不是不匹配,例如 |
|
|
匹配任何非单词字符 (等价于 |
|
|
匹配包括下划线的任何单词字符(等价于 |
|
|
匹配转义字符本身 |
|
|
分组匹配 |
|
|
分组匹配中的引用 分组匹配模式匹配到的字符会被记录在正则表达式引擎的内部变量中,这些变量使用 | 不支持 |
|
匹配 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) |
示例
- 显示
/etc/passwd
文件中,不以/bin/bash
结尾的行
grep -vE "/bin/bash$" /etc/passwd
- 找出
/etc/passwd
文件中包含两位数或者三位数的行
grep -E "\<[0-9]{2,3}\>" /etc/passwd
- 找出
/etc/profile
文件中,以至少一个空白字符开头,且以非空字符结尾的行
grep -E "^[[:space:]]+[^[:space:]]+$" /etc/profile
- 找出
netstat -tan
命令结果中,以LISTEN
或LISTEN
后跟1个或者多个空白字符结尾的行
netstat -tan | grep -E "LISTEN[[:space:]]*$"
- 显示当前系统中
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
- 找出
/etc/rc.d/init.d/functions
(centos
上有)文件中,某个单词后面跟一个小括号的行
grep -E "\<[[:alpha:]]+\>\(\)" /etc/rc.d/init.d/functions
- 找出
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])\>"
- 找出
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])\>)"
- 添加用户
bash
、testbash
、nologin
(设置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 |
|
-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次