目录
- 管道
- 正则表达式
- grep
- sed
- awk
一、什么是管道
- Linux提供管道符“
|
”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入
- 示例:
echo "hello123" | grep "hello"
二、正则表达式
-
正则表达式就是记录文本规则的代码
- 演练环境:https://tool.oschina.net/reqex
举例
-
找出所有的
hi
单词\bhi\b
-
hi
单词后面有lucy
单词\bhi\b.*\blucy\b
-
以
0
开头,然后是两个数字,然后是一个连字号“_”
,最后是8个数字0\d{2}-\d{8}
常用元字符
常用限定符
实战
- 匹配以字母a开头的单词 ——
\ba\w*\b
- 匹配刚好6个字符的单词 ——
\b\w{6}\b
- 匹配1个或更多连续的数字 ——
\d+
- 5位到12位QQ号 ——
^\d{5,12}$
三、grep命令
定义
- 根据用户指定的模式(pattern) 对目标文本进行过滤,显示被模式匹配到的行
命令形式
grep [OPTIONS] PATTERN [FILE...]
选项
-
-v
显示不被pattern匹配到的行 -
-i
忽略字符大小写 -
-n
显示匹配的行号 -
-c
统计匹配的行数 -
-o
仅显示匹配到的字符串 -
-E
使用ERE,相当于egrep
实战1
- 查找文件内容包含root的行数
grep -n root test.txt
- 查找文件内容不包含root的行
grep -nv root test.txt
-
test.txt 内容
-
实战
实战2-使用正则
四、sed 命令
定义
-
sed是流编辑器,一次处理一行内容
- 将行存储在模式空间
- sed命令进行处理
- 送入屏幕
- 清空模式空间
- 重复1-4直到所有行被处理完
命令形式
sed [-hn..][-e<script>][-f<script FILE>][FILE]
命令解析
-
sed [-hn.][-e<script>][-f<script文件>][文本文件]
-
-h
显示帮助 -
-n
仅显示script处理后的结果
-
-
sed [-hnV][-e<script>][-f<script文件>][文本文件]
-
-e<script>
以选项中指定的script来处理输入的文本文件 -
-f<script文件>
以选项中指定的script文件来处理输入的文本文件
-
常用动作
- a:新增
sed -e '4 a newline'
:在第四行后面新增一行“newline”
- c:取代
sed -e '2,5c No 2-5 number'
:用c
后面的内容“No 2-5 number”
取代2-5行的内容 - d:删除
sed -e '2,5d'
:删除2-5行 - i:插入
sed -e '2i newline'
:在第二行前面插入一行“newline”
- p:打印
sed -n '/root/p'
:打印匹配到root
规则的内容,/
之间的内容是使用正则 - s:取代
sed -e 's/old/new/g'
:后面的内容new
取代前面的内容old
,g
代表全局global
实战1
- 查看帮助
-
man sed
-
k
:往上翻 -
j
:往下翻 -
/内容
:查找指定内容 -
n
:查找下一个匹配到的内容 -
N
:查找上一个匹配到的内容
-
sed -h
-
- 在第四行后添加新字符串
sed -e '4 a newline testfile' test.txt
-e
可以省略
实战2
- 在第二行后加上newline
sed '2a drink tea' test.txt
- 在第二行前加上newline
-
sed '2i drink tea' test.txt
-
实战3
- 全局替换
sed -e 's/root/hello/g' test.txt
- 直接修改文件内容
-
sed -i 's/root/hello/g' test.txt
-
注意点
-
sed不会修改原文件,只会在模式空间中修改
-
要修改原文件需要加上
-i
参数,这里的-i
与常用动作中的i
不是一回事
五、awk 命令
定义
-
把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行后续处理
- 将第一行作为输入,并赋值给内置变量
$0
- 进行切段,比如
hello hello hello
通过空格进行切段,第一段为$1
,第二段为$2
,以此类推 - 对行匹配进行正则或执行其他动作
- 打印内容
- 读取第二行内容,重复1-4步骤
命令形式
awk 'pattern + action' [FILE]
命令解析
-
awk 'pattern + action' [filenames]
-
-pattern
正则表达式 -
-action
对匹配到的内容执行的命令(默认为输出每行内容)
-
常用参数
-
FILENAME
awk浏览的文件名 -
BEGIN
处理文本之前要执行的操作 -
END
处理文本之后要执行的操作 -
FS
设置输入域分隔符,等价于命令行-F
选项,默认为空格 -
NF
浏览记录的域的个数(列数) -
NR
已读的记录数(行数) -
OFS
输出域分隔符 -
ORS
输出记录分隔符 -
RS
控制记录分隔符,指定换行符,默认为\n
-
$0
整条记录 -
$1
表示当前行的第一1 个域...以此类推
实战1
- 搜索/etc/passwd有root关键字的所有行,并显示对应的shell
awk -F: '/root/{print $7}' /etc/passwd
- 打印/etc/passwd/的第二行信息
-
awk -F: 'NR==2{print $0}' /etc/passwd
-
实战2
-
使用begin加入标题
-
awk ‘BEGIN {print“BEGIN”,“BEGIN”}{print $1,$2}' /etc/passwd
-
-
自定义分割符
-
echo "111 222|333 444|555 666" | awk 'BEGIN{RS="l"}{print $0}'
-