0
点赞
收藏
分享

微信扫一扫

Linux之三剑客

王传学 2022-04-24 阅读 77
linux

下面所说的是Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep。
我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令。
在说这三个命令前我们要插入一个小插曲就是“正则表达式”和管道符。

一、管道符 “|”
什么是管道符?
Linux提供管道符"|"将两个命令隔开,管道符左边命令的输出机会作为管道符右边命令的输入。
示例:
echo “hello world” | grep -o hello
输出为:
hello

二、正则表达式
正则表达式就是记录文本规则的代码
常用的元字符:
1、. 匹配出换行符意外任意字符
2、\w 匹配字母或数字或下划线或汉字
3、 \s 匹配任意的空白符
4、\d 匹配数字
5、\b 匹配单词的开始或结束
6、^ 匹配字符串的开始
7、 $匹配字符串的结束
常用的限定符:
1、* 重复零次或更多次
2、+ 重复一次或更多次
3、? 重复零次或一次
4、{n} 重复n次
5、{n,} 重复n次或更多次
6、{n,m} 重复n到m次

在线正则练习地址:https://tool.oschina.net/regex
示例:
1、匹配以字母a开头的单词
\ba\w*\b

2\匹配刚好6个字符的单词
\b\w{6}\b

3、匹配1个或更多连续的数字
\d+

4、只匹配5位到12位的QQ号
^\d{5-12}$

5、hello hellojava hellopython hello
1.正则语法:\bhello\b --表示匹配hello单词
2.正则语法:\bhello\b.*\bhello --表示匹配开头和结尾是hello的

6、010-862965943
1.正则语法:0\d{2}-\d{9} --表示匹配开头是0后面2位数字,-连接符,后面9位数字

三、grep命令
定义:根据用户指定的模式(pattern)对目标文本进行过滤,显示被模式匹配到的行
语法:grep[options]pattern[file…]
选项:
-v 显示不被pattern匹配的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配到的行数
-o 仅显示匹配到的字符串
-E 使用ERE,相当于egrep

示例:
1、查找文件内容包含error的行数
grep -n error log.txt

2、查找文件内容不包含info的行
grep -nv info log.txt

3、查找以e开头的行
grep -n ^e log.txt

4、查找以n结束的行
grep -n n$ log.txt

四、sed命令
定义:sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
语法: sed [option]… ‘script’ inputfile
选项:
-n 不输出模式空间内容到屏幕
-e 多点编辑
-f /path/script_file:从指定文件中读取编辑脚本
-r 支持使用扩展正则表达式
-i 修改文件
-i.bak 备份文件并修改原文件

常用编辑参:
d 删除模式空间匹配的行,并立即启用下一轮循环
p 打印当前模式空间内容,追加到默认输出之后
a []text1 在指定行后面追加文本,支持使用\n实现多行追加
i []text 在行前面插入文本
c []text 替换行为单行或多行文本
w /path/somefile 保存模式匹配的行至指定文件
r /path/somefile 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理

示例:
1、查看帮助
man sed
sed -h

2、在第四行后添加新字符串
sed -i ‘4 a new string’ test.txt

3、在第二行前添加字符串
sed -i ‘2i new string’ test.txt

4、全局替换
sed -i ‘s/hello/HELLO/’ test.txt --只修改第一个匹配到的
sed -i ‘s/hello/HELLO/g’ test.txt --修改全文件的

五、awk命令
定义:把文件逐行读入,以空格位默认分隔符将每行切片,切开的部分再进行后续的处理
语法:awk ‘pattern + action’ [file]
选项:
-F 指明输入时用到的字段分隔符
-v var=value 自定义变量

常用参数:
FILENAME awk浏览的文件名
BEGIN 处理文本之前要执行的操作
END 处理文本之后要执行的操作
FS 设置输入域分隔符,等价于命令行-F选项
NF 浏览记录的域的个数 (列数)
NR 已读的记录数(行数)
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
$0 整条记录
$1 表示当前行的第一个域…以此类推

示例:
1、搜索/etc/passwd有root关键字的所有行,并显示对应的shell
awk -F : ‘/root/{print $7}’ /etc/passwd

2、打印/etc/passwd的第二行信息
awk -F : ‘NR==2{print $0}’ /etc/passwd

3、使用begin加入标题
awk -F : ‘BEGIN{print “BEGIN”,“BEGIN”}{print $1,$2}’ /etc/passwd

4、自定义分隔符
echo “111 222|333 444|555 666” | awk ‘BEGIN{RS="|"}{print $0}’

举报

相关推荐

linux三剑客

Linux三剑客

三剑客

Linux文本三剑客

linux的三剑客

0 条评论