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