Linux 正则表达式和Linux三剑客(grep,sed,awk)

Linux 正则表达式

*代表所有

?没什么意义

!取反

[] 小括号的使用:

[abcd] 匹配adcd中任何一个字符,abcd也可是其他任意不连续的字符,或a,或b…

[a-z] 匹配a到z 之间的任意一个字符,字符前后要连续,也可以用连续数字[1-9]

[!abcd] 表示不匹配括号里面的任何一个字符,也可书写[!a-d],感叹号可用^符号替代

’ '单引号的使用

’ ’ 写什么输出什么

" "双引号的使用

1.不知道用什么引号就用双引号

2.会对命令做解析

3.不加引号,和双引号类似,双引号是一个整体

‘ ’ 反引号和括号的使用

反引号相当于$()效果

#号使用

1.root用户命令提示符

2.表示注释的内容

3.命令替换中的分隔符 比如 vim替换 %s#原文件#替换文件#g ,公式:%s#原文#新文#g

列如:%s#129#921#g

\反斜杠使用

逃脱符或者转义字符,即将有特殊含义的字符(通配符或者正则表达式)还原字符本意

例如:? 只表示问号本身‘

seq:数字序列

用法:打奇偶 用法:seq 起始 步长 结束 负数代表倒着打

例如:seq 1 2 5 seq 5 -2 1

打印 :1 3 5 5 3 1

竖打 xargs -n 1 分组打印每次一组

例如:echo {00…10} | xargs -n l

seq -w -s " " ; -s指定分隔符,横向打印序列

拼接,批量创建用户:seq -w 10 |sed -r ‘s#(.*)#useradd \1#g’

&&用法

&& 并且的意思 and前面正常,后面才输出

echo $? 输出0是正确的,非0是错误的

|| 用法

|| 表示或者 or 前面输出错误,后面才输出

!用法

!取反,可以做判读,输出1命令是正确的

正则表达式(基础篇)

^ 尖角号,匹配以某单词开头的行;例如:^oldboy 表示以oldboy单词开头的行。

例如: grep ^I 文件名

ls -l 路径 |grep ^d

$ 美元符,表示某单词结尾的行;例如:oldboy$ 表示以oldboy单词结尾的行。

例如:grep m$ 文件路径

^$ 组合符,表示空行,逻辑解释就是以^结尾的行,或者以$开头的行

例如:grep ^$ /test/oldboy.txt 输出空行,不显示空行行号

​ grep -n ^$ /test/oldboy.txt 显示空行的行号

. 点号,表示匹配任意一个且只有一个字符(但是不能匹配空行),相当于所有

例如:grep -n “.$” /test/oldboy.txt

*重复前一个字符,会出现之前不匹配的,到之前匹配的。

例如:grep “2*” /test/oldboy.txt

\ 转义字符,让特殊含义的字符脱掉马家,现出原型,如. 只表示小数点

.* 组合符,匹配所有内容

^.* 组合符,匹配任意多个字符开头的内容

.*$ 组合符,以任意多个字符结尾的内容

[abc] 匹配[]中,a或b或c

扩展正则:

grep -E ====egrep

+加好使用

匹配前一个字符一次或多次;和*号区别

*号可以匹配0次

例如:grep “0*” oldboy.txt #匹配0个0或1个0或多个0 全部出来,高亮显示有0的行

egrep “0+” oldboy.txt # 匹配1个0或者多个0 只显示匹配的行

[:/]+ 匹配括号内的:或/字符1次或多次

例如:egrep "[:/]+" oldboy.txt

egrep -o "[:/]" oldboy.txt  只显示匹配的内容

?匹配前一个字符0次或1次;和.区别,少了0次

| 意思是或;

例如:egrep “000|oldboy” oldboy.txt 匹配000或者oldboy 字符

() 表示分组过滤被括号括起来的东西,表示一个整体;另外() 内容可以被后面的\n引用,n 为数字,表示引用第几个括号内容。

\n 引用前面()小括号里的内容,例如: (aa)\1,匹配aaaa

例如:egrep “(0)(0)\1\2” oldboy.txt

\1 可以取出第一个括号的内容,\2可以取出第2个括号的内容,剩下的以此类推

sed命令

a{n,m} 匹配前一个字符最少n次,最多m次

例如:egrep “0{3,4}” oldboy.txt

a{n,} 匹配前一个字符最少n次,

例如:egrep “0{3,}” oldboy.txt

a{n}匹配前一个字符正好n次

例如:egrep “0{3}” oldboy.txt

a{,m} 匹配前一个字符最多m次

例如:egrep “0{,3}” oldboy.txt

正则练习题:

1.过滤/etc/passwd中含有root或oldboy的行

grep -E "root|oldboy" /etc/passwd

2.过滤/etc/passwd中至少含有1个或0字符的行

egrep "0+" /etc/passwd

3.过滤/etc/passwd中匹配o字符0次或1次的行

egrep "o?" /etc/passwd

4.过滤/etc/passwd中匹配0字符1次到3次的行

egrep "0{1,3}" /etc/passwd

5.过滤/etc/shadow中匹配含有连续多个冒号和反斜杠的行

 egrep "[:/]+"  /etc/shadow
横竖转换

echo “oldboy oldgril littboy” > a.txt 写入数据

egrep “.” a.txt 显示全部内容

egrep -o “.” a.txt 竖着显示文本内容

egrep -o “.” a.txt |sort 把相同的字母按顺序显示

sed命令语法使用

语法格式:

Sed 选项 sed内置命令字符 输入文件

选项 -n 取消默认sed输出,常与sed内置命令的p连用

​ 输出想要的内容

​ 框架:sed -n ’ p’ 文件名

​ 例如:取oldboy文件2-4行文件

 sed -n '2,4p' oldboy.txt

​ 框架:sed -n ‘/ /p’ 文件名

​ 例如取出包含oldboy字符行

1.sed -n '/oldboy/p' oldboy.txt

2.grep oldboy oldboy.txt

​ -i 直接修改文件内容,而不是输出到终端。修改备份前请备份 cp 或者 -i.bak

例如:sed -i  's#com#cn#g' test.txt
备份: sed -i.bak '/com/d' txt.txt
扩展知识,vimdiff 修改文件  备份文件.bak #对比文件不同,高亮显示
diff 查看文件差异  
diff 修改文件  备份文件.bak

​ -e 允许多次编辑

​ -s 替换,一般和g公用,g代表全局

​ -p 全拼print,表示打印匹配行的内容,通常p与-n一起使用。

​ -d 删除

例如文件中删除含有www的字符
sed -n '/www/p' txt.txt #查看
sed '/www/d' txt.txt #删除
删除2,4行的www行
sed -n '2,4p' txt.txt #查看
sed '2,4d' txt.txt #删除

​ -a 追加

sed -i '2a I teach linux.' test.txt
也可以使用 -i 追加
sed -i '2i I teach linux,at 2i' test.txt

练习:取/etc/passwd中的第5-15行,重定向到/test/test.txt

sed -n  '5,15p' /etc/passwd > /test/test.txt

练习:在/test/test.txt中如何插入两行

sed  '2i  I teach linux.\n I teach linux,at 2i .' /test/test.txt

例子:^.* int 以任意多个字符开头,给出一个唯一int结尾的内容

		net.*$ 以唯一的内容开头,以任意多个字符结尾
awk 使用

awk 语法格式:框架:awk 参数 条件{动作} 文件

列如:awk '{print $2}' b.txt #打印第2列
	 awk '{print $1,$3}' b.txt #打印第1,3列
	 awk '{print $0}'  b.txt #打印整行
	 awk '{print $NF}' b.txt  #打印最后一列
	 awk '{print $(NF-1)}' b.txt #打印倒数第二列

-F 指定字段分隔符

awk -F ":" '{print $1}' b.txt #以冒号分隔打印第一列
awk -F ":"  '{print $1,$NF}' b.txt #以冒号分隔打印第一列和最后一列

变量名 属性

$n 当前记录的第n个列,字段间由FS或-F参数指定分隔符

$0 当前整行记录

NF 当前记录中的列的个数,就是多少列

${NF -n } 倒数第n列,n为数字

NR 已经读出来的记录数,就是行号,从1开始

cut命令

cut 切:

-d 指定分隔符 (awk -F)

-f 数字指定哪列,多列用逗号或-

-c 按字符取内容

指定冒号为分隔符,取第一列
例如: cut -d: -f1 /etc/passwd
取连续多列(1-3列)
例如:cut -d ":" -f1-3 /etc/passwd
按字符取1-3,以及8-10
例如:echo oldboy oldgirl|cut -c 1-3,8-10
/var 目录重要文件信息
message:可以记录系统服务运行状况
方式一:grep -E "信息1|信息2|信息3"  文件信息     #---同时过滤多个信息
例如:查看网卡信息报错语句:
grep -Ei "error|fails|invalid" #i 忽略大小写 

根据时间过滤信息:
grep "时间.*"  文件
grep -c "时间.*" 文件 #统计次数
例如:grep -c "22.*fail"  text.txt #统计这个文件有fail的次数
列如:将文件text.txt 文件根据时间过滤。
grep "22.*" text.txt
grep "22.*error" text.txt #过滤含有error信息
grep "22.*fail"  text.txt #过滤含有fail信息
grep -Ei "22.*(error|fail)" text.txt
讲解:grep -Ei "A(B|C)" 文件:找AB 或AC 的
grep -B 前面几行 "时间.*"  文件  #找出错误前面几行
例如:grep -B 2 -Ei "22.*(error|fail)" text.txt #找出该文件error,fail前面两行
grep -A 后面几行 "时间.*"  文件 找出后面几行
例如:grep -A 2 -Ei "22*.(error|fail)" text.txt #找出该文件error,fail后面两行
整合:grep -A 2 -B 1 -Ei "22.*(error|fail)" text.txt #找出该文件error,fail后面两行,前面一行
居中:grep -C 行数 "时间.*"  文件
grep -C 1 -Ei "22.*(error|fail)" text.txt #找出该文件已error,fail为中心上下一行
遍历递归查找:grep -r 关键词 文件路径


查看CPU核数
grep -c "physical id" /proc/cpuinfo
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值