1、简介
Linux 操作文本的三大利器分别是grep、sed 、awk
,简称三剑客。
大师兄awk
:最擅长取列;二师兄sed
:最擅长取行;三师兄grep
:最擅长过滤。
2、正则表达式
3、大师兄-awk
awk
是对文本进行格式化的工具,适合处理比较复杂的格式处理。命令格式:
awk [options] 'pattern {acticon}' file1 file2, ...
其中:
options
参数:输入分隔符,默认以空白字符分隔,通过 -F 选项来执行分隔符
commands
是真正awk命令,print
是awk打印
指定内容的主要命令;
file1 file2
是待处理的文件;
pattern
部分决定动作语句何时触发及触发事件:BEGIN
、END
;
3.1、options 参数
options 参数:输入分隔符,默认以空白字符分隔,通过-F
选项来执行分隔符
$1
分割出来的第一段(第1列),$2
分割出来的第二段(第2列),依次类推,$0
代表所有字段。
演示:
我们使用awk分割meminfo这个文件:
只显示第1列:
awk `{print $1}` /proc/meminfo
如果我们想在打印第1列之前再打印出一些字段:
awk `{print ”meminfo:” $1}` /proc/meminfo
将ls的执行结果进行分割,awk配合使用管道符号|
ls -l | awk '{print $1}'
打印多列:
ls -l | awk '{print $1 $2}'
这个时候第2列就和第1列合在一起了:
我们将其分开,加一个制表符\t
ls -l | awk '{print $1 "\t" $2}'
再加第3列:
ls -l | awk '{print $1 "\t" $2 "\t" $3}'
将所有的数据都打印出来:($0
)
ls -l | awk '{print $0}'
面试题:
问题:文件名为urls,我们需要将域名提取出来!
此时我们需要更改分割的符号了,不能使用默认的符号来分割文件了!
awk -F '/' '{print $3}' urls
为什么是$3?
以新的分隔符\
作为列的划分标准!//
的坐标http:
为第1列;//
中间的空的为第2列;为第3列;
输出分隔符:
默认情况下输出分隔符是空格,使用内置变量 OFS来设定输出分隔符,需要加上-v
选项。
awk -v OFS="-->" '{print $1,$2}' test
3.2、awk 变量
FS
:输入字段分隔符,默认空白字符,一般需要加 -FOFS
:输出字段分隔符,默认是空格,一般需要加 -vNF
:分隔后的字段数量;NR
:当前行的行号;3.3、pattern模式
pattern 模式:模式是条件,符合条件的行, awk 才会进行处理;
awk -F '#' 'NF==5 {print $1}' test
如果行的分段数量为5 的话(分段式用#分的),进行打印操作,其他的类似,如 NF>2,NF<4,$1==1234 等都是判断条件;
awk -F '#' 'NF>=4 && NF<=5 {print $1}' test
4、二师兄 – sed
sed
是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”;接着用sed
命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。sed
命令格式:
sed [options]... 'script' inputfile
4.1、选项
-n:不输出模式空间内容到屏幕,即不自动打印-e:多点编辑-f /PATH/SCRIPT_FILE:从指定文件中读取编辑脚本-r:支持使用扩展正则表达式-i:直接编辑文件-i.bak:备份文件并原处编辑
4.2、script 地址定界
1、不给地址:对全文进行处理
2、单地址:
#
:指定的行;$
:最后一行;/pattern/
:被此处模式所能够匹配到的每一行;
4.3、编辑命令
d 删除模式空间匹配的行,并立即启用下一轮循环p 显示符合条件的行,追加到默认输出之后a [\]text1 在指定行后面追加文本,支持使用\n实现多行追加i [\]text 在行前面插入文本c [\]text 替换行为单行或多行文本w /path/somefile 保存模式匹配的行至指定文件r /path/somefile 读取指定文件的文本至模式空间中匹配到的行后= 为模式空间中的行打印行号! 模式空间中匹配行取反处理s///:查找替换,支持使用其它分隔符,s@@@,s###
4.3、替换标记
g 行内全局替换p 显示替换成功的行w /PATH/TO/SOMEFILE 将替换成功的行保存至文件中
4.4、实例
sed -n 2p test #打印第 2 行内容
sed -n 2,5p test #打印第 2--5 行内容
sed -i 's/a/v/g' test 将文件中的 a 全部替换为 v 「sed替换格式是:sed -i ‘s/要替换的内容/替换成的内容/g' 文件名」
5、三师兄 – grep
grep
强大的文本搜索工具,根据模式搜索文本,并将符合模式的文本行显示出来。grep
命令格式:
grep 【option】 pattern 【file】
-i:忽略字符大小写-n:显示匹配的行号-v:显示没有被匹配的行--color:将匹配的字符以高亮颜色标记出来-c:统计匹配的行数-o:仅显示匹配到的字符串-q:静默模式,不输出任何信息-e:实现多个选项间的逻辑 or 关系-v:反转查找-w:匹配整个单词-A:after ,显示后行-B:before ,显示前行-C:context,显示前后行-E:相当于 egrep,即 grep -E = egrep
5.1、实例说明
grep -i 'b' test #在文件 test 中查找字符 b
grep -q 'abc' test 静默执行。不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试
grep -n 'v' test 查找包含字符 v 的行数
grep -nv 'v' test 查找不包含字符 v 的行数
grep -n v$ test 查找以 v 结尾的行
grep -v 'v' test 反向查找,没有v
grep 'ljl' -A 2 test 输出匹配结果行的后 2 行
grep 'wooow' -B 2 test 输出匹配结果行的前 2 行
grep -n 'abc' test1 test2 test3 或 grep -n 'abc' test* 多个文件查找匹配的结果行
6、参考
Linux 三剑客实例详解「grep、sed 、awk」