Linux文本三剑客(grep sed awk)
Linux 里素有三剑客之称的 grep sed awk 今天主要记录一下它们的用法…
正则表达式
# 首先,三剑客是和正则表达式搭配着来使用的,我们这里简单的介绍一下正则表达式里常用的几个
字符 | 说明 | 举例 |
---|---|---|
^ | 匹配字符串开头 | ^aaa 匹配以aaa开头的所有字符串 |
$ | 匹配字符串结尾 | bbb$ 匹配以bbb结尾的所有字符串 |
. | 匹配任意单个字符 | 匹配 “cat” 可以写成 c.t |
[] | 匹配集合中的任意字符 | 匹配dog 可以写成 [abcd]og |
- | 表示匹配的一个范围 | 例如匹配一个英文小写字母,可以写成 [a-z] |
* | 匹配零个或多个字符 | 例如匹配 sleep sl*p |
+ | 匹配前面的模式至少一次或多次 | 例如 cat c+t |
? | 匹配零个或一个字符 | 例如 bee 写成 b?e |
{n} | 匹配前面的模式恰好n次 | 例如 caat 写成 ca{2}t |
\ | 转义特殊字符:使用反斜杠 \ 来转义特殊字符 | 例如匹配 “2+2=4”:2\+2=4 |
---|---|---|
\n | 匹配一个换行符 | \n 表示换行 |
| | 逻辑或操作符 | cat|dog |
开始介绍文本三剑客
1.文本剑客之一 grep
grep 只是用来查找指定文件中的字符串,然后输出到控制台上或者标准输入输出上
grep仅仅只是匹配到对应的内容,但是无法修改(修改的事情交给sed剑客去做)
1.1 语法格式 grep [参数选项] [匹配模式] [查找的文件]
1.2 参数说明
参数 | 参数说明 |
---|---|
-A | 显示匹配的内容之外,还显示该行之后的N行 After(之后) |
-B | 显示匹配的内容之外,还显示该行之前的N行 Before (之前) |
-C | 显示匹配的内容之外,还显示该行之前后的N行 |
-c | 统计匹配的行数 |
-e | 相当于逻辑or |
-E | 支持扩展的正则表达式,我的理解,不加这个参数,你在grep里使用正则表达式的时候会报错,仅仅只有grep一个剑客而已 |
-i | 忽略大小写 |
-n | 显示所匹配内容的所在行号 |
-o | 仅仅显示匹配到的字符串 |
-v | 排除某些匹配到的字符串 |
-q | 不输出任何信息,脚本中常用 |
-w | 匹配整个单词 |
1.3 实战演练
# 先准备好一个操作的文本内容,文件名叫 demo1.txt
# 内容如下
-----------------------------------------------------
处在低谷的时候,不要气馁,相信自己,慢慢积累能量,一鸣惊人。
人贵在有自知之明,但敢于为先者,当守望者也。
There is only one life
there is book
I want you to live seriously
I want to you!
动手记录一些东西,长此以往,你会有一笔可观的精神财富。
期待自己,不报怨他人,以本我为中心,实现人生价值。
-----------------------------------------------------
# 1.将包含"守望"这一行找出来
grep "守望" demo1.txt
# 2.除了包含life 这一行,还需要展示后面的2行
grep -A2 "life" demo1.txt # 只距离-A ,-B -C的用法相同
# 3.找出以"人"开头的一行
grep "^人" demo1.txt
# 4.统计一下匹配到"I" 这个的行数有多少
grep -c "I" demo1.txt
# 5.显示匹配"to"这一行的的行号是多少
grep -n "to" demo1.txt
# 6. 过滤掉"to"这个字符串并显示行号,其余的输出
grep -v -n "to" demo1.txt
# 7.过滤掉空行
============
^$ 表示空格 | 表示或 # 表示注释符号
============
grep -Ev '^$' demo1.txt # 这里用双引号也是可以的,单引号是因为我自己后面的格式问题.
# 8.同时过滤多个不同字符串,例如 life live
grep -e "life" -e "live" demo1.txt
# 9.不区分大小写 过滤there
grep -i "there" demo1.txt
2.文本剑客之二sed
sed 是 stream editor 的缩写,简称流编辑器。
sed 可以对文本进行增删改查
2.1 语法格式 sed [参数选项] [sed内置命令字符] [输入文件]
2.2 参数说明
参数 | 参数说明 |
---|---|
-n | 取消默认的sed输出,常与sed内置命令p连用 |
-i | 直接修改文件的内容 而不是输出到终端 |
a | append,表示追加文本,在指定行后添加一行或多行文本 |
d | delete,表示删除匹配行的文本 |
i | insert,表示插入文本,在指定行前添加一行或多行文本 |
p | print,表示打印匹配行的内容,通常与-n参数一起使用 |
s | replace 替换正则表达式regexp所匹配的内容 |
2.3 实战演练
# 准备好操作的内容,我这里的文件名叫 demo2.txt
# 内容如下
------------------------------------------------------------
email:1596557283@qq.com
address:陕西省咸阳市
qq:12345678
weixin:ztpksow666
age:99
------------------------------------------------------------
# 1. 将'99'替换为18
sed 's/99/18/' demo2.txt
# 2. 在每一行行首加上@符号
sed 's/^/@/g' demo2.txt # 这里的g 表示的是全局匹配
# 3.在行尾加上%
sed 's/$/%/g' demo2.txt
# 4.将1-3 行的所有1替换成9,第四行往后数字都替换成*
sed '1,3s/1/9/g ;4,$s/[0-9]/*/g' demo2.txt
# 5.将替换后的内容写入到另外的文件中
sed 's/qq/QQ/w file1.txt' demo2.txt
# 6.修改qq为QQ,并写入到源文件,(意思就是真正改变源文件的内容)
sed -i 's/qq/QQ/' demo2.txt
# 7.所有行后面追加一行@@@@
sed 'a @@@@' demo2.txt
# 8. 删除weixin 这一行,第四行
sed '4d' demo2.txt # 也可以是删除1-5行, sed '1,5d' demo2.txt
# 9.删除文件中所有的数字
sed 's/[0-9]//g' demo2.txt
# 10. 在1,2行前面插入!!!
sed '1,2i !!!' demo2.txt
# 11.打印第1,2行内容
sed -n '1,2p' demo2.txt
3.文本剑客之三awk
3.1 语法格式 grep [参数选项] [条件动作] [文件]
3.2 参数说明
参数 | 参数说明 |
---|---|
-F | 自定义字段分隔符 |
NR | 表示当前行 Now Record |
NF | 表示当前列 Now Filed |
RS | 表示行分隔符 Record Split 默认是换行 |
FS | 表示列分隔符 Filed Split 默认是空格和制表符 |
OFS | 输出列分隔符 Output Filed Split 默认为空格 |
ORS | 输出行分割符 Output Record Split 默认为换行符 |
awk里内置了很多的函数,也可以自定义函数,这里列举一些常用的
函数 | 函数功能 |
---|---|
gsub(r, s, t) | 在t 内,用r 替换 s |
index(s, t) | 返回字串t在s中的位置 |
tolower(s) | 将字符串s转换为小写 |
toupper(s) | 将字符串s转换为大写 |
3.3 实战演练
# 准备一个内容 demo3.txt
-------------------------------------
-rw-r--r-- 1 root root 192 Mar 26 14:28 test1.txt
-rw-r--r-- 1 root root 6 Mar 26 10:05 test2.txt
-rw-r--r-- 1 root root 10 Mar 26 10:24 test3.txt
-rw-r--r-- 1 root root 44 Mar 17 22:27 test.txt
-rw-r--r-- 1 root root 0 Mar 11 22:52 tt.txt
-------------------------------------
# 1.显示第2行
awk 'NR==2' demo3.txt # == 表示等于,=是赋值
# 2.显示1-3行
awk 'NR==1,NR==3' demo3.txt
# 3.输出文件中的1,2,3列
awk '{print $1,$2,$3}' demo3.txt
# 4.打印第二列和最后一列
awk -F " " '{print $2,$NF}' demo3.txt # 使用-F自定义分割符
# 5.指定分隔符打印
awk '{print $1,"---",$2}' demo3.txt
# 6.将root 替换为localhost
awk '{gsub("root","localhost",$0);print $0}' demo3.txt # 这里的$0代表的就是demo3.txt
# 7.awk也是一个编程语言,也有if else for等
awk '{if($3=="root") print "这是root";else print "这不是root"}' demo3.txt
小总结
- grep 更适合单纯的查找或匹配文本
- sed 更适合编辑匹配到的文本
- awk 更适合格式化文本,对文本进行较复杂格式化处理
还有很多三剑客的小技巧,感兴趣的话自行去查看书籍…