目录
Linux正则表达式
Linux文本处理三剑客之grep
Linux文本处理三剑客之sed
Linux文本处理三剑客之awk
Linux核心通配符:
*:匹配任意长度的任意字符
?:匹配任意单个字符
[ ]:匹配指定范围内的任意单个字符
[ ^ ]:匹配指定范围外的任意单个字符
grep:(全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行;模式:由正则表达式的元字符及文本字符所编写出的过滤条件;
用法:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
选项OPTIONS:
--color=auto 对匹配到的文本进行高亮显示
-E:支持使用扩展正则表达式
-i:忽略大小写
-o:仅仅显示匹配到的字符串本身
-n:显示行号
-v:显示不能被匹配到的行
-A num:后num行
-B num:前num行
-C num:前后num行
grep -w : 使grep命令只查找作为一个词,而不是词的一部分去做匹配
[root@localhost tmp]# grep 'tom' /etc/passwd
tom:x:1000:1000::/home/tom:/bin/bash
tomnew:x:1001:1001::/home/tomnew:/bin/bash
[root@localhost tmp]# grep -w 'tom' /etc/passwd
tom:x:1000:1000::/home/tom:/bin/bas
sed是一种新型的、非交互的编辑器。
sed工作原理:
sed编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。sed把当前正在处理的行保存在一个临时缓冲区中(这个缓冲区称为模式空间或临时缓冲),sed处理完模式空间中的行后(即在该行上执行sed命令后),就把该行发送到屏幕上。sed处理完文件的最后一行后,sed便结束运行。sed把每一行都存在模式空间中,对这个副本进行编辑,所以不会修改或破坏原文件。
sed用法(按行处理)
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
option
-n:不输出模式空间中的内容到标准输出
-e:多点编辑
-f file:
-r:支持扩展正则表达式
-i:直接编辑源文件 {script-only-if-no-other-script}
地址定界:
1、空地址:代表整个文件
2、指定地址 #:指定的行 /pattern/:匹配到的行
3、地址范围 #,# #,+# #,/pattern/ /pattern/,# /pattern1/,/pattern2/
4、1~2,代表所有奇数行 2~2,代表所有偶数行 1~#,间隔#行
5、$行尾
分界符 @ 、^、 、!、 |
编辑命令
d:删除
p:显示模式空间中的内容
a:在行后
i:在行前
w /path/to/somefile :把模式空间中匹配到的行保存到指定的文件
=:为模式匹配到的行打印行号
r /path/to/somefile:
!:
s/old/new/g:查找替换@@@ ###
g 全局替换
高阶用法
保持空间、模式空间
高阶命令
显示偶数行 sed -n 'n;p'
逆序显示文件内容
取出最后一行 sed '$!'
显示奇数行 sed 'n;d'
在原有的每行后加一行空白行
[root@localhost ~]# sed -n "n;p" /etc/passwd(显示偶数行)
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
awk是一种编程语言
语法结构
awk options commonds filename
-F:定义分隔符 默认是制表符 tab
commonds 'BEGIN{} /pattern/{body} END{}'
要时刻记着:BEGIN 是预处理阶段, body 是 awk 真正工作的阶段,END 是最后处理阶段。
awk中,$0 代表行记录 $1----$#每个字段 最多100个字段 显示时默认以空格为分割符, 内部变量 FS默认是空格 awk在输出的时候 print
内置变量:
FS:输入字段的分隔符,默认为空格,多个空白字符
OFS:输出字段分隔符
ORS:输出记录分隔符
RS:输入记录分隔符,默认是换行符
NF:字段数
NR:已经读入的记录中的行号,在body区域 和END区域内容显示有区别
FNR:输入文件的记录数
FILENAME:当前处理文件的文件名
字符串变量
\n 换行符
\t 水平制表符
\v 垂直制表符
自定义变量
变量自增自减 ++$1 $1++ --$1 $1--
一元操作 -$1 +$1 算数操作 +-*/%
赋值操作
=
+=
*= /= %=
比较操作
>,>=,<,<=,==,!=,&&,|| 精确匹配
~,!~ 模糊匹配
编程语言
循环 分支判断
if
单个if
if-else
awk -f awk.file
BEGIN{
FS=":"
}
{
if($4<=50000)
print $2,"is less than 50000!"
else
print $2,"is more than 50000!"
}
# awk 'BEGIN{FS="[,:%]"} {if($4 <= 50000) {print $2,"is less than 50000" }
else {print $2,"is more than 50000"}}' file
if-else if
BEGIN{
FS="[,:%]";print "-----------" }
{ if($4 <30000)
print $2,"is less than 30000"
else if($4 > 60000)
print $2,"is more than 60000"
else
print $2,"XXXXXXXX"
}
END{
print "--------"
}
# awk 'BEGIN{FS="[,:%]"} {if($4 < 30000) {print $2,"is less than 50000" }
else if($4 > 60000) {print $2 } else {print $2,"is more than 50000"}}' file
格式化输出 printf