三剑客之grep、sed、awk
grep工具
grep是行过滤工具;用于根据关键字进行行过滤
语法:
1 | # grep [选项] '关键字' 文件名 |
常见选项:
1 | OPTIONS: |
颜色显示(别名设置):
centos 7 之后都默认自带的
1 | 临时设置: |
举例说明:
说明:不要直接使用/etc/passwd文件,将其拷贝到/tmp下做实验!
1 | # grep -i root passwd 忽略大小写匹配包含root的行 |
sed工具
其主要功能为对文件进行修改处理,可以对文件或标准输入数据流进行增删改查等操作,尤其适用于大文件或有规律的文件
适用场景
- 超大文件处理;
- 有规律的文本,例如格式化后的日志文件等;
- 对文件进行批量增加,替换等。
语法:
1 | sed 选项 "地址界定 命令" 处理的文件 |
例子:
生成1到50的行的文件
1 | seq 50 > test |
查询
1
2
3
4
5
6显示3和11行
[root@localhost test]# sed -n '3p;11p' test
显示3到11行
[root@localhost test]# sed -n '3,11p' test
显示最后一行(使用正则表达式)
[root@localhost test]# sed -n '$p' test删除
1
2
3
4全部删除
[root@localhost test]# sed 'd' test
删除最后一行
[root@localhost test]# sed '$d' test插入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18第10行上面插入xxxx (i可以理解成infor)
[root@localhost test]# sed '10i xxxx' test
第10行下面插入xxxx (a可以理解成after)
[root@localhost test]# sed '10a xxxx' test
10到最后一行下面插入xxxx (a可以理解成after 这里用到了正则)
[root@localhost test]# sed '10,$a xxxx' test
把第10行的10,改成xxxxx (10s代表第用两个井号隔开)
[root@localhost test]# sed '10s#10#xxxxx#' test
5到10行行末尾插入xxxxx
[root@localhost test]# sed '5,10s#$#xxxxx#' test
提示!
`-i.bak`先备份后执行,会多出一个文件xxx.bak
[root@localhost test]# sed -i.bak '$d' testsed的反向引用
例子:批量重命名1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36生成文件,目的将生成的文件改成hello_+数字.log
[root@localhost mv]# touch hello_{10010..10030}_world.log
测试:
[root@localhost mv]# find . -type f -name '*.log' | sed -r 's#^(.*)_world(.*)#mv \0 \1\2#'
解释:find:寻找文件名包含log的文件,sed用正则匹配语句\0代表完整的名称,\1\2代表两个括号匹配的内容。
mv ./hello_10010_world.log ./hello_10010.log
mv ./hello_10011_world.log ./hello_10011.log
mv ./hello_10012_world.log ./hello_10012.log
mv ./hello_10013_world.log ./hello_10013.log
mv ./hello_10014_world.log ./hello_10014.log
mv ./hello_10015_world.log ./hello_10015.log
mv ./hello_10016_world.log ./hello_10016.log
mv ./hello_10017_world.log ./hello_10017.log
mv ./hello_10018_world.log ./hello_10018.log
mv ./hello_10019_world.log ./hello_10019.log
mv ./hello_10020_world.log ./hello_10020.log
mv ./hello_10021_world.log ./hello_10021.log
mv ./hello_10022_world.log ./hello_10022.log
mv ./hello_10023_world.log ./hello_10023.log
mv ./hello_10024_world.log ./hello_10024.log
mv ./hello_10025_world.log ./hello_10025.log
mv ./hello_10026_world.log ./hello_10026.log
mv ./hello_10027_world.log ./hello_10027.log
mv ./hello_10028_world.log ./hello_10028.log
mv ./hello_10029_world.log ./hello_10029.log
mv ./hello_10030_world.log ./hello_10030.log
-----分割线-----
以上正是我们需要使用到的语句,最后添加管道符号让bash执行
[root@localhost mv]# find . -type f -name '*.log' | sed -r 's#^(.*)_world(.*)#mv \0 \1\2#' | bash
ll查看,完成
awk 工具
它更偏向于对文本的格式化处理输出,它不仅仅是一款工具,也是一门解释性语言
awk
同sed
命令类似,只不过sed
擅长取行,awk
命令擅长取列,awk是对文本进行格式化输出,sed更倾向于对文件进行修改;
用以下文本coins.txt
作为实验
1 | gold 1 1986 USA American Eagle |
语法格式
1 | awk {语句} 执行的文件 |
例子:
1 | 查看文本的前三列。\t 只是为了更美观显示 |
更详细的链接:
http://www.imooc.com/wiki/shelllesson/awk.html
https://www.runoob.com/linux/linux-comm-awk.html
awk实在是太难用了,自我感觉操作列的话用cut
反而更合适
cut工具
cut是列截取工具,用于列的截取
语法和选项
语法:
1 | # cut 选项 文件名 |
常见选项:
1 | -c: 以字符为单位进行分割,截取 |
举例说明:
1 | # cut -d: -f1 1.txt 以:冒号分割,截取第1列内容 |
- 例子
用小工具列出你当系统的运行级别。5/3
- 如何查看系统运行级别
- 命令
runlevel
- 文件
/usr/lib/systemd/system/ctrl-alt-del.target
- 命令
- 如何过滤运行级别
1
2
3
4
5
6
7
8
9
10runlevel |cut -c3
runlevel | cut -d ' ' -f2
grep -v '^#' /etc/inittab | cut -d: -f2
grep '^id' /etc/inittab |cut -d: -f2
grep "initdefault:$" /etc/inittab | cut -c4
grep -v ^# /etc/inittab |cut -c4
grep 'id:' /etc/inittab |cut -d: -f2
cut -d':' -f2 /etc/inittab |grep -v ^#
cut -c4 /etc/inittab |tail -1
cut -d: -f2 /etc/inittab |tail -1
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 食葫芦的葫芦娃!
评论