grep通配及正则表达式

管道
|:前一个命令输出是下一条命令的输入 如:echo "redhat" | passwd --stdin hive
tee:保存到文件同时输出到屏幕
[root@localhost ~]# echo "redhat" | tee /tmp/tee.log
redhat
grep、egrep、fgrep:文本查找
grep (默认显示被模式匹配到的行)
-i:不区分大小写
--color:匹配的字符高亮显示
-v:显示没有被模式匹配的行
-o:只显示被模式匹配到的字符串
-E:使用扩展正则表达式
-A 2:显示被模式匹配的行及其行后面的2行
-B 2:显示被模式匹配的行及其行前面的2行
-C 2:显示被模式匹配的行及其行前后面的2行

正则表达式:REGEXP
元字符:
. :点代表任意单个字符
[]:范围内的任意单个字符
[^]:范围外的任意单个字符
匹配次数
*:匹配*前面的字符任意次
.*:任意长度的任意字符
\?:匹配?前面的字符1次或0次 \代表转译,避免bash来解释,给grep来用
\{m,n\}:匹配其前面的字符至少m次,至多n次,n不写代表没有上限
位置锚定
^:锚定行首,此字符后面的任意内容必须出现在行首
$:锚定行尾,此字符前面的任意内容必须出现在行尾
^$:空白行
\<或\b :锚定词首,其后面的任意字符必须作为单词首部出现
\> 或\b:锚定词尾,其前面的任意字符必须作为单词的尾部出现
\<root\>匹配root单词
分组
\(\)
\(ab\)*:代表ab可以出现多次或0次 后向引用
1\:应用第一个左括号以及与之对应的右括号所包括的所有内容 grep '\(l..e\).*\1' test3.txt 如果匹 配的love \1代表应用love
2\:括号可以嵌套,与之对应就可以了

egrep(扩展正则表达式grep -E)
字符匹配:与grep一致

次数匹配:无需\斜线
*:其前的字符任意次
?:0或1次
+:其前字符至少一次
{m,n}:至少m次,至多n次,没有上限可以省略n

位置锚定:与grep一致

分组:无需\斜线
():分组
\1,\2,\3,....

或者
| :or ‘(C|c)at’ 匹配的是Cat和cat ‘C|cat’ 匹配的是C和cat,里面有个分组的概念
grep -E --color '^[[:space:]]+' /boot/grub/grub.conf 至少一个空白字符开头的行
egrep --color '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-5])\>' /boot/grub/grub.conf 存在|或的关系,锚定词首词尾需整体括号括起来
fgrep:不支持正则表达式

{#* }:从左到右去除以首个空格为分隔符左边的内容
{##* }:从左到右去除最后以空格为分隔符左边的内容
{% *}:从右到左去除以首个空格为分隔符右边的内容 如修改文件后缀: for i in `ls | grep ".png"`;do mv $i ${i%.*}.jjj;done  
{%% *}:从右到左去除最后以空格为分隔符右边的内容
如: A='25 80 100 90'
echo ${A#* } --->80 100 90 echo ${A##* } --->90
echo ${A% *} --->25 80 100 echo ${A%% *} --->25

文件名通配,globbing
*:匹配任意长度的任意字符
?:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[a-zA-Z]、[0-9]、[0-9a-zA-Z]
[:space:]:空白字符
[:punct:]:标点符号
[:lower:]:小写字母
[:upper:]:大写字母
[:alpha:]:大小写字母
[:digit:]:数字
[:alnum:]:数字和大小写字母
如:ls [[:digit:]]* 数字开头任意结尾
[^]:匹配指定范围之外的任意单个字符(取反)
[^[:space:]]:非空白字符
[^[:punct:]]:非标点符号
[^[:lower:]]:非小写字母
[^[:upper:]]:非大写字母
[^[:alpha:]]:非大小写字母
[^[:digit:]]:非数字
[^[:alnum:]]:非数字和大小写字母
如:ls [^[:digit:]]* 以非数字开头任意结尾

 

posted @ 2022-05-24 16:06  Me-lihu  阅读(318)  评论(0编辑  收藏  举报