正则表达式是一种符号表示法,被用来识别文本中的模式。
grep
grep [options] regex [file…]
grep选项列表
例子ls /bin > dirlist-bin.txt ls /usr/bin > dirlist-usr-bin.txt ls /sbin > dirlist-sbin.txt ls /usr/sbin > dirlist-usr-sbin.txt ls dirlist*.txt dirlist-bin.txt dirlist-sbin.txt dirlist-usr-sbin.txt dirlist-usr-bin.txt 在所有列出的文件中搜索字符串 bzip grep bzip dirlist*.txt dirlist-bin.txt:bzip2 dirlist-bin.txt:bzip2recover -l 选项列出包含匹配模式的文件 grep -l bzip dirlist*.txt dirlist-bin.txt -L选项列出包含匹配模式的文件 grep -L bzip dirlist*.txt dirlist-sbin.txt dirlist-usr-bin.txt dirlist-usr-sbin.txt
元字符和文本
原义字符:匹配本身 (例如bzip)
元字符:^ $ . [ ] { } - ? * + ( ) | \
所有非元字符都被认为是原义字符. 被用来匹配单个任意字符 ^和$ 被看作锚点,分别表示开头和结尾 [] 指定的字符集合中匹配一个单个的字符 []中的第一个字符是^ 表示不匹配字符集合中的字符 [A-Za-z0-9] [A-Z] [a-z] [0-9] 表示字符区域 + 匹配1个或多个 * 匹配0个或多个 ? 匹配0个或1个 {} 匹配特定个数的元素 如:{m,n} 表示m至n个 | 则是或意思.如:ps(a|b),则匹配psa或者psb \ 是转义字符
POSIX 字符集
先看两个例子(查找以大写字母开头的文件)
ls /usr/sbin/[ABCDEFGHIJKLMNOPQRSTUVWXYZ]* /usr/sbin/MAKEFLOPPIES /usr/sbin/NetworkManagerDispatcher /usr/sbin/NetworkManager ls /usr/sbin/[A-Z]* /usr/sbin/biosdecode /usr/sbin/chat /usr/sbin/chgpasswd /usr/sbin/chpasswd /usr/sbin/chroot /usr/sbin/cleanup-info /usr/sbin/complain /usr/sbin/console-kit-daemon
明显可以看出第二例子有问题,它含有以小写字母开头的文件!
原因在于ASCII中字母的排列规则是ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
而为了满足不在 U.S.英语范围内的字符,扩充了ASCII,使用了添加了字符(128-255)。POSIX 中的 locale ,可以选择所需的字符集,echo $LANG 查看当前字符集一般为en_US.UTF-8。它使用字典排列顺序而不是 ASCII 顺序。
aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
export LANG=POSIX可以使系统为它的字符集使用 U.S.英语,即ASCII
POSIX 字符集