正则表达式
Table of Contents
基本符号
在 [] 里面, .* 等符号均表示字符不表示其他 在 [] 里面, ^ 会被解释为非, 但是在外面就会被解释为 开头的意思 在 [] 里面, 只有 ^ 和 - 才有特殊意义 * : 0 或无穷. 例如 grep a* 会把所有的数据都输出出来, 有没有都可以 . : 任意一个字符 .*: 任意 [[:alnum:] ]: 字母和数组 [[:alpha:] ]: 字母 [[:blank:] ]: 空格和 tab [[:cntrl:] ]: 控制键 [[:digit:] ]: 数字 [[:graph:] ]: 除了空格和 tab 之外 [[:lower:] ]: 小写 [[:upper:] ]: 大写 [[:print:] ]: 能打印出来的字符 [[:punct:] ]: 标点符号 [[:space:] ]: 空格, [[Tab] ], CR 等等 [[:xdigit:] ]: 16 进制 0-9, A-F, a-f [^[:xdigit:]]: 表示非 16 进制数 ^[^[:xdigit:]]: 表示开头是非 16 进制数 \s: 空白字符 \S: 非空白字符 \w: [a-zA-Z0-9] \W: [^a-zA-Z0-9] \d: 数字, [[:digit:] ] [0-9] \D: 除数字之外, [^0-9]
定位
句首: ^ \A 句末: $ \Z \z s$: 匹配以 s 结尾的行 空白行: ^$ 单词前: \< 单词后: \> 单词前后:\b echo "hello world" | grep "\bhello\b" 非单词前后:\B echo "ahelloworld" | grep "\Bhello\B"
匹配到的次数
要表示查找一个字符 2 到 5 次, 可以用 grep ‘a\{2,5\}‘ FILE
如果没有加\, 那么会出错.
pattern\{n\} # 匹配 n 次 pattern\{n,\} # 匹配至少 n 次 pattern\{n,m\} # 匹配 n 次到 m 次之间的次数
延伸的正则表达式
- 普通的正则表达式
grep -v ‘^$‘ FILE | grep -v ‘^#‘
除去行首为#的行列.
- 延伸的正则表达式
egrep -v ‘^$|^#‘ FILE
其中 egrep 可以是 grep -E ‘|‘ 表示或者的意思
+ 重复一个或者无穷个
寻找 god good goood…
grep ‘goo*d‘ FILE # * 表示前面的 0 个或者无穷多 egrep ‘go+d‘ FILE # + 表示前面的 1 个或者无穷多
? 0 个或 1
寻找 god good 这 2 个字符串.
egrep -n ‘goo?d‘
- 和 ? 的集合就是 go*d,
| 或者的意思
egrep -n ‘god | good‘ FILE egrep -n ‘god | good | goood‘ FILE
() 群组
寻找 glad good
egrep ‘g(la | oo)d‘ FILE # 括号里面的空格仍然表示空格
()+ 多个重复群组的判别
echo ‘AxyxyxyxyxyxyxyC‘ | egrep ‘A(xy)+C‘
perl 环视
不了解.
perl 非捕获型括号(?:…)
(1|one)(?:and|or)(2|two)
$1 就会等于 1 或者 one $2 就会 跳过 (and|or) 直接等于 2 或者 two
perl 命名捕获(?<NAME>)
(?<Area>\d\d\d)-(?<Exch>\d\d\d)-(?<Num>\d\d\d)
grep
-A | 后面可加数字,为 after |
-B | 后面可加数字,为 befer |
–color=auto | 颜色 |
–color=never | 颜色 |
-a | binary 文件以 text 文件的方式搜索 |
-c | 计数 |
-i | 忽略大小写 |
-n | 输出行号 |
-l | 输出匹配到的文件 |
-L | 输出没有匹配到的文件 |
-v | 输出不含有 STRING |
-o | match only |
## grep 的另一个用法 if [ -n "$(echo $1 | grep ‘^-[0-9][0-9]*$‘)" ]; then echo $1 else echo "Usage: sh FILENAME -NUMBER" fi # 保存到 test.sh # 输入 sh test.sh -9999 # 输出 9999 # 输入 sh test.sh 999 # 输出 Usage: sh FILENAME -NUMBER # 输入 sh test.sh -99ab # 输出 Usage: sh FILENAME -NUMBER ## grep 和 shift 的组合 while [ -n "$(echo $1 | grep ‘^-‘)" ]; do case $1 in "-a") echo "-a"; ;; "-b") echo "-b"; ;; "-c") echo "-c"; ;; *) echo "Uage: sh FILENAME [-a] [-b] [-c]"; ;; esac shift done # 保存到 test.sh # 输入 sh test.sh -a -b -c # 输出 -a -b -c
使用 grep 捕捉 ldd 的输出
ldd /bin/bash | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"