正则表达式
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: 空白字符
§: 非空白字符
\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,\}"