Linux三剑客 grep sed awk
bash
- bash是一个命令处理器,运行在文本窗口中,并能执行用户直接输入的命令
- bash还能从文件中读取linux命令,称为脚本
- bash还支持通配符,管道,命令替换,条件判断等逻辑控制语句
bash的特性
- 命令行展开
1 | echo {tom,bob,chaoge,jerry} |
- 命令别名
1 | // 查看当前的别名 |
- 历史记录
1 | history |
- 快捷键
ctrl + a 移动到行首
ctrl + e 移动到行尾
ctrl + u 删除光标之前的字符
ctrl + k 删除光标之后的字符
ctrl + l 清屏,相当于clear
Linux三剑客
文本处理工具,均支持正则表达式引擎
- grep:文本过滤工具,模式(pattern)工具
- sed:stream editor,流编辑器;文本编辑工具
- awk:Linux的文本报告生成器(格式化文本),
Linux 正则表达式
- 正则表达式是一套规则和方法
- 正则工作时以行为单位,一次处理一行
- 正则表达式化繁为简,提高工作效率
- linux仅受三剑客(sed,awk,grep)支持,其它命令无法使用
基本正则表达式BRE集合
- 匹配字符
- 匹配次数
- 位置错定
符号 | 作用 |
---|---|
^ |
尖角号,用于模式的最左侧,如^oldboy 匹配以oldboy单词开头的行 |
$ |
美元符,用于模式的最右侧,如oldboy$ 表示以oldboy单词结尾的行 |
^$ |
组合符,表示空行 |
. |
匹配任意一个且只有一个字符,不能匹配空行 |
\ |
转义字符,让特殊含义的字符,现出原形,还原本意,例如\. 代表小数点 |
* |
匹配前一个字符(连续出现)0次或1次以上,重复0次代表空,即匹配所有内容 |
.* |
组合符,匹配所有内容 |
^.* |
组合符,匹配任意多个字符开头的内容 |
.*$ |
组合符,匹配以任意多个字符结尾的内容 |
[abc] |
匹配集合内的任意一个字符,a或b或c,可以写[a-c] |
[^abc] |
匹配除了^后面的任意字符,a或b或c,表示对[abc] 的取反 |
扩展正则ERE集合
扩展正则表达式必须用grep -E
且才能生效
字符 | 作用 |
---|---|
+ |
匹配前一个字符1次或多次 |
[: /]+ |
匹配括号内的”:”或者”/字符1次或多次 |
? |
匹配前一个字符0次或1次 |
| |
表示或者,同时过滤多个字符串 |
() |
分组过滤,被括起来的内容表示一个整体 |
a{n,m} |
匹配前一个字符最少n次,最多m次 |
a{n.} |
匹配前一个字符最少n次 |
a{n} |
匹配前一个字符正好n次 |
a{,m} |
匹配前一个字符最多m次 |
grep
全拼:Global search REgullir expression and Print out the line.
作用:文本搜索工具,根据用户指定的模式(过滤条件)
对目标文本逐行进行匹配检查,打印匹配到的行
模式:由正则表达式的元字符
及文本字符
所编写出的过滤条件
1 | 语法 |
正则表达式练习
准备练习文件
1 | touch test.txt |
输出所有以m开头的行
1
2grep ^m test.txt -n
grep ^m test.txt -in输出所有以i开头的行
1
grep ^i test.txt -in
输出所有以.结尾的行
1
grep "\.$" test.txt -n
注意,在linux下,文件所有行结尾都有一个$
符号
匹配所有不是空行的
1
grep "." test.txt -n
匹配所有内容
1
grep ".*" test.txt -n
找出包含htt和hco的行
1
grep -E "h(tt|co)." test.txt -n
匹配test2中 good,gooood 等
1
grep -E "go{2,}d" test2.txt
匹配前后都有 love 的行
1
grep -E "(love).*\1" test2.txt
sed
注意sed和awk使用单引号,双引号有特殊解释
sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器。
sed是操作、过滤和转换文本内容的强大工具。
常用功能包括结合正则表达式对文件实现快速增删改查,其中查询的功能中最常用的两大功能是过滤(过滤指定字符串)、取行(取出指定行)。
语法:
1 | sed [选项] [sed内置命令字符] [输入文件] |
sed匹配范围
范围 | 解释 |
---|---|
空地址 | 全文匹配 |
单地址 | 指定文件某一行 |
/pattern/ | 被匹配到的每一行 |
范围区间 | 10,20 十到二十行,10,+5 第10行向下5行,/pattern1/,/pattern2/ |
步长 | 1~2 表示1,3,5,7,9奇数行,2~2 表示2,4,6,8,10 偶数行 |
sed练习
输出第二行和第三行
1
sed -n '2,3 p' test.txt
输出第二行后的三行
1
sed -n '2,+3 p' test.txt
输出有python的行
1
sed -n '/python/p' test.txt
删除包含qq的行
1
sed '/qq/d' test.txt -i
将所有的my改位he
1
sed 's/My/hei/g' test.txt -i
将所有的is替换为are,并且把python 改为java
1
sed -e 's/is/are/g' -e 's/python/java/g' test.txt -i
在第二行后插入一行
1
sed '2a My linux is not good' test.txt -i
在第四行前插入一行
1
sed '4i My linux is not good' test.txt -i
awk
awk是一个强大的iux命令,有强大的文本格式化的能力,好比将一些文本数据格式化成专业的excel表的样式
awk早期在Unix上实现,我们用的awk是gawk,是GUN awk的意思
awk更是是一门编程语言,支持条件判断、数组、循环等功能
awk语法
1 | awk [opthon] 'pattern[action]' file ... |
action指的是动作,awk擅长文本格式化,而且输出格式化后的结果,因此最常用的动作就是print和printf
awk 外层单引号,内层双引号
参数 | 解释 |
---|---|
-F | 指定分割字段 |
-v | 定义或修改一个awk内部的变量 |
-f | 从脚本文件中读取awk命令 |
变量
- 内置变量
内置变量 解释 FS 输入字段分隔符,默认为空白字符 OFS 输出字段分隔符,默认为空白字符 RS 输入记录分隔符(输入换行符),指定输入时的换行符 ORS 输出记录分隔符(输出换行符),输出时用指定符号代替换行符 NF NF:number of Field,当前行的字段的个数(即当前行被分割成了几列,字段数量 NR NR:行号,当前处理的文本行的行号。 FNR FNR:各文件分别计数的行号 FILENAME FILENAME:当前文件名 ARGC ARGC:命令行参数的个数 ARGV ARGV:数组,保存的是命令行所给定的各参数 - 自定义变量
1
awk -v myvar="yjr1100" 'BEGIN{print myvar}{print $1,myvar}' test.txt
格式化输出printf
要点:
- 其与print命令的最大不同是,printf需要指定format;
- format用于指定后面的每个item的输出格式;
- printf语句不会自动打印换行符;
\n
format格式的指示符都以%
开头,后跟一个字符;如下:%c
:显示字符的ASCII码;%d
,%i
:十进制整数;%e
,%E
:科学计数法显示数值%f
:显示浮点数;%g
,%G
:以科学计数法的格式或浮点数的格式显示数值;%s
:显示字符串;%u
:无符号整数;%%
:显示%自身;
printf修饰符:
-:左对齐;默认右对齐,
+:显示数值符号; printf”%+d”
awk的模式
BEGIN/END 模式
BEGIN{} 处理完指定的文本前,先执行BEGIN模式指定的动作
END{} 处理完所有文本只有,执行END{}模式指定的动作1
awk 'BEGIN{print "处理文本之前"}{print $0}END{print "处理文本后"}' test.txt
运算符模式
关系运算符 解释 示例 < 小于 x<y <= 小于等于 x<=y == 等于 x==y != 不等于 x!=y >= 大于等于 x>=y > 大于 x>y ~ 匹配正则 x~/正则/ !~ 不匹配正则 x~/正则/ 1
awk 'NR!=3{print $0}' test.txt
正则模式
语法:
1
2grep '正则表达式' test.txt
awk '/正则表达式/动作' test.txt1
awk -F ':' '/games/{print $1,$NF}' pwd.txt
想要使用多个正则表达式,只需要在正则表达式之间用逗号隔开就可以
awk 练习
1 | touch test.txt |
awk默认以空格为分隔符,且多个空格也识别为一个空格作为分隔符
awk是按行处理文件,一行处理完毕,处理下一行,根据用户指定的分隔符去工作,没有指定则默认空格
输出每一行
$0代表一整行
1
awk '{print $0}' test.txt
输出第二列
$2代表第二列
1
awk '{print $2}' test.txt
输出最后一列,倒数第二列,
NF代表分隔后,当前行一共有多少字段
1
awk '{print $NF,$(NF-1)}' test.txt
输出第五行,
NR代表当前文件的行数
1
awk 'NR==5{print $0}' test.txt
输出代行号的文件
1
awk '{print NR,$0}' test.txt
输出用y分割后的第三列结果
1
awk -F 'y' '{print $3}' test.txt
输出用===分割,用y分割后的第三列和第五列结果,OFS代表分隔符变量,-v修改内置变量
1
awk -F 'y' -v OFS="===" '{print $3,$5}' test.txt
格式化输出
1
awk '{printf "%s\n",$0}' test.txt