正则就是用一些具有特殊含义的符号组合一起来描述字符或字符串的方法。
在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,
下面我们就为大家介绍三种文本处理工具/命令:grep、sed、awk,它们三者均可以解释正则
一:grep
参数
-n :显示行号
-o :只显示匹配的内容
-q :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
-l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc
-A :如果匹配成功,则将匹配行及其后n行一起打印出来
-B :如果匹配成功,则将匹配行及其前n行一起打印出来
-C :如果匹配成功,则将匹配行及其前后n行一起打印出来
--color
-c :如果匹配成功,则将匹配到的行数打印出来
- E :等于egrep,扩展
-i :忽略大小写
-v :取反,不匹配
-w:匹配单词
注:为了使用扩展正则表达式,建议使用grep时直接使用egrep
正则介绍:
^ 行首
$ 行尾
. 除了换行符以外的任意单个字符
* 前导字符的零个或多个
.* 所有字符
[] 字符组内的任一字符
[^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)
^[^] 非字符组内的字符开头的行
[a-z] 小写字母
[A-Z] 大写字母
[a-Z] 小写和大写字母
[0-9] 数字
\< 单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
\> 单词尾
扩展正则 sed 加 -r 参数 或转义
grep 加 -E 或 egrep 或转义
AWK 直接支持 但不包含{n,m}
可以使用--posix支持
[root@MiWiFi-R3-srv ~]# awk '/ro{1,3}/{print}' /etc/passwd
[root@MiWiFi-R3-srv ~]# awk --posix '/ro{1,3}/{print}' /etc/passwd
sed -n '/roo\?/p' /etc/passwd
sed -rn '/roo?/p' /etc/passwd
? 前导字符零个或一个
+ 前导字符一个或多个
abc|def abc或def
a(bc|de)f abcf 或 adef
x\{m\} x出现m次
x\{m,\} x出现m次至多次(至少m次)
x\{m,n\} x出现m次至n次
grep使用样例:
grep -A 100 "root" /etc/passwd
过滤后100行
grep -B 100 "root" /etc/passwd
过滤前100行
-C是前后几行的内容
#egrep 'r[abc123]\-\/t' b.txt
r1t
r2t
#egrep 'r[0-9]{2}t' b.txt
r34t
r56t
r78t
递归查找目录下包含特殊字符的文件名
grep -lr 'root' /
####################################################################
sed
语法:
sed [options] '定位 操作' file
options 部分
-n
-e
-i
-f
command 部分
'[地址1,地址2] [函数] [参数(标记)]'
定址的方法 1.数字 2.正则
数字
十进制数
1 单行
1,3 范围 从第一行到第三行
2,+4 匹配行后若干行
4,~3 从第四行到下一个3的倍数行
2~3 第二行起每间隔三行的行
$ 尾行
1! 除了第一行以外的行
正则
正则必须用//包裹起来
扩展正则需要用 -r 参数或转义
数字定址:sed -n '1p' /etc/passwd
正则定址:sed -n '/^root/p' /etc/passwd
增删改
a 后插
c 替换
i 前插
d 删除
输入输出
p 打印匹配的行 一般和 -n 参数连用,以屏蔽默认输出
r 从文件中读入
w 写入到文件中
控制流
! 命令取反 例: 1!d 删除第一行以外的行
{} 命令组合 命令用分号分隔 {1h;G} 可以理解为 -e 参数的另一种写法
= 打印行号(输入行的号码,而非处理的次数行号) 例如: sed -n '2{=;p}' infile
n 读入下一行到模式空间 例:'4{n;d}' 删除第5行
N 而是追加下一行到模式空间,再把当前行和下一行同时应用后面的命令
替换
s 字符串替换 s/old/new/
sed 使用样样例:
#sed -r '/^[0-9]([a-Z]{3})psn$/ s/sn/good/g' b.txt
把以数字开头中间三个字线以psn结尾的全部换成pgood
#sed -r '/^[0-9]([a-Z]+)psn$/ s/sn/good/g' b.txt
此题与上题相似,后面正则字符+号的意思是后面字线可以出现一次到无数次,而以psn结尾的换成pgood.
#sed -r 's/^([a-Z]+)([^a-Z])/\2/g' test
去掉每一行的第一个单词
#sed -r 's/([^a-Z])([a-Z]+)$/\1/g' test
去掉最后一个单词
#sed -r 's/^([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/3\2\1\4/g' test
第一个单词和第二个单词互换位置
#sed -r 's/^(.)(.*)$/\2/' test
删除文件每行的第一个字符
#sed -r 's/^(.)(.)(.*)$/\1\3/' test
删除文件每行的第二个字符
#sed -r 's/([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)$/\1\3\4/' test
删除倒数第二个单词
补充:
[root@www ~]# sed [-nefr] [动作] 选项与参数: -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。 -e :直接在命令列模式上进行 sed 的动作编辑; -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作; -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法) -i :直接修改读取的文件内容,而不是输出到终端。 动作说明: [n1[,n2]]function n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』 function: a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚; i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~ s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
sed -i 就是直接对文本文件进行操作的
sed -i 's/原字符串/新字符串/' /home/1.txt sed -i 's/原字符串/新字符串/g' /home/1.txt
这两条命令的区别就是,看示例吧
这是1.txt的内容
#cat 1.txt d ddd #ff
再看执行这两条命令的区别吧
sed -i 's/d/7523/' /home/1.txt 执行结果 7523 7523dd #ff sed -i 's/d/7523/g' /home/1.txt 执行结果 7523 752375237523 #ff
去掉 “行首” 带“@”的首字母@
sed -i 's/^@//' file
特定字符串的行前插入新行
sed -i '/特定字符串/i 新行字符串' file
特定字符串的行后插入新行
sed -i '/特定字符串/a 新行字符串' file
特定字符串的删除
sed -i '/字符串/d' file
########################################################################
awk
格式
awk -F ‘定位{操作}' file
NR当前行号;NF当前列数
#awk -F: 'NR==1{print $1,NR}' test
打印第一行的第一列,且显示行号
#awk -F: 'NR<=3{print NR,"----",$1}' test
打印前三行的行号,和第一段内容
#awk -F: 'NR<=2||NR>7{print NR,"---",$1}' test
打印出前两行或者7行后的行号,和第一段内肉
#awk -F: '/nologin$/{print $1}' test
打印以nologin结尾的第一列内容,正则表达式的引用需要用//
#awk -F: '$1~/^r.*t$/{print $3}' test
$1~代表只用第一段来匹配正则表达式
#awk -F: '$1==root{print NR,$3}' test
#ifconfig|awk 'NR==2{print $2]'
打出当前系统的ip
#cat a.txt|sort|uniq -c
uniq -c是表示 总共去除了多少个重复的行
#cat a.txt|cut -d: -f1,3
以:为切割符,显示第1,3列
#find / -size +10M -size -30M
查找根下大于10小于30的文件
find -type -f是找出普通 文件
find / -size +2M -type -f -name "\*.txt"