linux shell 正则表达式

1. 基本语法

1.1 字符类

字符含义举例
.匹配任意一个字符abc.可以匹配 abcd、 abc9 等
[]匹配括号中的任意一个字符[abc]d 可以匹配 ad、 bd 或 cd
-在[]括号内表示字符范围[0-9a-fA-F]可以匹配一位十六进制数字
^位于[]括号内的开头,匹配除括号中的字符之外的任意一个字符[^xy]匹配除 xy 之外的任一字符,因此[^xy]1 可以匹配 a1、 b1 但不匹配 x1、 y1
[[:xxx:]]grep 工具预定义的一些命名字符类[[:alpha:]]匹配一个字母, [[:digit:]]匹配一个数字

1.2 数量限定类

字符含义举例
?紧跟在它前面的单元,应匹配零次或一次[0-9]?\.[0-9]匹配 0.0、 2.3、 .5 等,由于.在正则表达式中是一个特殊字符,所以需要用\转义一下,取字面值
+紧跟在它前面的单元,应匹配一次或多次[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z0-
9_.-]+匹配 email 地址
*紧跟在它前面的单元,应匹配零次或多次[0-9][0-9]*匹配至少一位数字,等价于[0-9]+, [azA-Z_]+[a-zA-Z_0-9]*匹配 C 语言的标识符
{N}紧跟在它前面的单元,应精确匹配 N 次[1-9][0-9]{2}匹配从 100 到 999 的整数
{N,}紧跟在它前面的单元,应匹配至少 N 次[1-9][0-9]{2,}匹配三位以上(含三位)的整数
{,M}紧跟在它前面的单元,应匹配最多 M 次[0-9]{,1}相当于[0-9]?
{N,M}紧跟在它前面的单元应匹配至少 N 次,最多 M 次[0-9]{1,3}\.[0-9]{1,3}\.[0-
9]{1,3}\.[0-9]{1,3}匹配 IP 地址

2. grep

2.1 作用

     Linux 系统中 grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配
的行打印出来。 grep 全称是 Global Regular Expression Print,表示全局正则表达式版本,它
的使用权限是所有用户。
     grep 家族包括 grep、 egrep 和 fgrep。 egrep 和 fgrep 的命令只跟 grep 有很小不同。 egrep 是
grep 的扩展,支持更多的 re 元字符, fgrep 就是 fixed grep 或 fast grep,它们把所有的字母都
看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。 linux 使用
GNU 版本的 grep。它功能更强,可以通过-G、 -E、 -F 命令行选项来使用 egrep 和 fgrep 的功
能。

2.2 格式

2.3 实例
 

1. grep ‘test’ d*
显示所有以 d 开头的文件中包含 test 的行。

2. grep ‘test’ aa bb cc
显示在 aa, bb, cc 文件中匹配 test 的行。

3. grep ‘[a-z]\{5\}’ aa
显示所有包含每个字符串至少有 5 个连续小写字符的字符串的行。

4. grep ‘w\(es\)t.*\1′ aa
如果 west 被匹配,则 es 就被存储到内存中,并标记为 1,然后搜索任意个字符(.*),这些字符后面紧
跟着 另外一个 es(\1),找到就显示该行。如果用 egrep 或 grep -E,就不用”\”号进行转义,直接写
成’w(es)t.*\1′就可以了。

5. 其他参数
grep -r :明确要求搜索子目录
grep -d skip : 忽略子目录
grep -i pattern files :不区分大小写地搜索。默认情况区分大小写,
grep -l pattern files :只列出匹配的文件名,
grep -L pattern files :列出不匹配的文件名,
grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不
                       是’magical’),
grep -C number pattern files :匹配的上下文分别显示[number]行,
grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,
  例如: grep "abc\|xyz" testfile 表示过滤包含 abc 或 xyz 的行
grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。
grep -n pattern files 即可显示行号信息
grep -c pattern files 即可查找总行数

同时满足多个字符串查找:
grep 字符串1 文件名| grep 字符串2|grep 字符串3|grep ...


6.判断一个文件中是否有指定字符串
利用grep执行的命令结束代码$?的值来判断是否已经grep到特定的值。
当$?等于0时,表示已经找到。
当$?不等于1时,表示没有找到。
当$?大于1时,表示命令执行错误,可能是参数错误什么的导致命令没有成功执行。

example1:
key_str="test"
grep -i $key_str test.log > /dev/null
if [ $? -eq 0 ]
then
    echo "fount it"
else
    echo "can't fount it"
fi

example2:
-q 参数,本意是 Quiet; do not write anything to standard output.  Exit immediately with zero status if any match is found, even if an error was detected. 
中文意思为,安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0。

key_str_arrray=(abc 123 erg cba)
for str in ${key_str_arrray[@]}
do
    echo $str | grep -q test.log
    if [ $? -eq 0 ]; then
        echo  $file 
    fi
done


3. find

3.1 格式


pathname: find 命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录,递归查找。
-print: find 命令将匹配的文件输出到标准输出。
-exec: find 命令对匹配的文件执行该参数所给出的 shell 命令。相应命令的形式为'command' {} \;,注意{ }和\;之间的空格。
-ok: 和-exec 的作用相同,只不过以一种更为安全的模式来执行该参数所给出的 shell 命令,在执行
每一个命令之前,都会给出提示,让用户来确定是否执行。

-options:

3.2 实例

一. name选项

1. 在自己的根目录$HOME 中查找文件名符合*.txt 的文件
find ~ -name "*.txt" -print

2. 想要在当前目录及子目录中查找所有的‘ *.txt’文件
find . -name "*.txt" -print

3. 想要的当前目录及子目录中查找文件名以一个大写字母开头的文件
find . -name "[A-Z]*" -print

4. 想要在/etc 目录中查找文件名以 host 开头的文件
find /etc -name "host*" -print

5. 想要查找$HOME 目录中的文件
find ~ -name "*" -print 或 find ~ -print

6. 要想让系统高负荷运行,就从根目录开始查找所有的文件:
find / -name "*" -print

7. 如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是.txt 的文件,下
面的命令就能够返回例如名为 ax37.txt 的文件:
find . -name "[a-z][a-z][0-9][0-9].txt" -print

----------------------------------------------------------------------------------
二. 忽略某个目录
   如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可
以使用-prune 选项来指出需要忽略的目录。在使用-prune 选项时要当心,因为如果你同时使用
了-depth 选项,那么-prune 选项就会被 find 命令忽略。

1. 如果希望在/apps 目录下查找文件,但不希望在/apps/bin 目录下查找
find /apps -path "/apps/bin" -prune -o -print

2. 避开多个文件夹
find /home \( -path /home/itcast/f1 -o -path /home/itcast/f2 \) -prune -o -print

----------------------------------------------------------------------------------
三. 按照更改时间或访问时间等查找文件
   如果希望按照更改时间来查找文件,可以使用 mtime,atime 或 ctime 选项。如果系统突然没有
可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用 mtime 选项来查找
这样的文件。
   用减号-来限定更改时间在距今 n 日以内的文件,而用加号+来限定更改时间在距今 n 日以前的
文件。

1. 希望在系统根目录下查找更改时间在 5 日以内的文件
find / -mtime -5 -print

2.为了在/var/adm 目录下查找更改时间在 3 日以前的文件
find /var/adm -mtime +3 -print


----------------------------------------------------------------------------------
四. 使用size选项
   可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字
节来计量。以字节计量文件长度的表达形式为 N c;以块计量文件长度只用数字表示即可。

1. 在当前目录下查找文件长度大于 1 M 字节的文件:
find . -size +1000000c -print

2. 在/home/apache 目录下查找文件长度恰好为 100 字节的文件:
find /home/apache -size 100c -print

4. 在当前目录下查找长度超过 10 块的文件(一块等于 512 字节):
find . -size +10 -print

----------------------------------------------------------------------------------
五. 其他
1.查看当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的
文件:
find . -type f -perm 644 -exec ls -l {} \

4. xargs

4.1 格式

4.2 实例

1. 查找系统中的每一个普通文件,然后使用 xargs 命令来测试它们分别属于哪类文件
find . -type f -print | xargs file

2. 在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:
ls -l
find . -perm -7 -print | xargs chmod o-w
ls -l

3. 用 grep 命令在所有的普通文件中搜索 hello 这个词:
find . -type f -print | xargs grep "hello"

4. 用 grep 命令在当前目录下的所有普通文件中搜索 hello 这个词:
find . -name \* -type f -print | xargs grep "hello"

注意:
在上面的例子中, \用来取消 find 命令中的*在 shell 中的特殊含义。
find 命令配合使用 exec 和 xargs 可以使用户对所匹配到的文件执行几乎所有的命令。

5.sed

         sed 意为流编辑器(Stream Editor),在 Shell 脚本和 Makefile 中作为过滤器使用非常普遍,
也就是把前一个程序的输出引入 sed 的输入,经过一系列编辑命令转换为另一种格式输出。
sed 和 vi 都源于早期 UNIX 的 ed 工具,所以很多 sed 命令和 vi 的末行命令是相同的。

5.1 格式

5.2 实例

6. awk

       sed 以行为单位处理文件, awk 比 sed 强的地方在于不仅能以行为单位还能以列为单位处理文
件。 awk 缺省的行分隔符是换行,缺省的列分隔符是连续的空格和 Tab,但是行分隔符和列分
隔符都可以自定义,比如/etc/passwd 文件的每一行有若干个字段,字段之间以:分隔,就可以
重新定义 awk 的列分隔符为:并以列为单位处理这个文件。

6.1 格式

6.2 实例
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值