grep(global regular expression print)程序会在文本文件中查找一个指定的正则表达式输出到标准输出
ls /usr/bin | grep zip
| 管道命令,作为输出输入grep 查找 zip字符(接受参数 :选填参数,文件和正则表达式)--都是可以多个的
grep [options] regex [file...]
regex 是正则表达式
[ options ] -i --ignore-case 忽略大小写查找 -v --inert-match 打印出非匹配内容
-c --cout 输出匹配(-v)不匹配的数目 等于 |wc -l -l --files-with-matches 知道所查找的几个文件是否含有我们要找
的内容输出是文件名称 -L 是与-l相反的不匹配内容的文件名称 -n --line-number 添加匹配信息行号
-h --no-filename 多文件搜索的结果不显示文件名
显示结构:匹配文件名:匹配信息1
^ $ . [ ] { } - ? * + ( ) | \
以上为元字符 (有功能意义) 其他字符为原意字符(是单纯的匹配字符
单引号是全引用 双引号是部分引用(变量和常量赋值后) 反引号执行命令结果赋值
grep -h '.zip' dirlist*.txt
grep -h '^zip' dirlist*.txt
grep -h 'zip$' dirlist*.txt .原点元字符 匹配任意 ^ $ .前 后 锚点元字符 *匹配任意多个
grep -i '^..j.r$' text.txt
grep -h '[bg]zip' dirlist*.txt []中括号是包含任意一个符合就行 [^ ]非包含内容
grep -h '^[A-Z]' dirlist*.txt 以大写字母开头的文本 -
grep -h '[-AZ]' dirlist*.txt 匹配包含一个连字符,或一个大写字母“A”,或一个大写字母“Z”的文件名
grep -h '^[A-Za-z0-9]' dirlist*.txt
通配符怎样被用来完成路径名展开操作
[me@linuxbox ~]$ ls /usr/sbin/[A-Z]*
/usr/sbin/biosdecode 他没有好好工作出结果
POSIX 标准介绍了一种叫做 locale 的概念,其可以被调整,来为某个特殊的区域, 选择所需的字符集。通过使用下面这个命令,我们能够查看到我们系统的语言设置
[me@linuxbox ~]$ echo $LANG
en_US.UTF-8 local.conf里面修改
通过这个设置,POSIX 相容的应用程序将会使用字典排列顺序而不是 ASCII 顺序所以没有好好工作出的原因是因为路径匹配是另外的方式而不是ASCLL码,而正常的grep匹配是ASCLL码,所以POSIX提供字符集来让我们更好的查找内容。
基本正则表达式(BRE)和扩展的正则表达式(ERE)元字符的问题
^ $ . [ ] *
( ) { } ? + | 添加元字符
grep 命令(虽然我们能以 egrep 程序来代替)添加了-E 选项 就是扩展egrep 支持(ERE)ERE
() 小括号选择替换匹配
grep -Eh '^(bz|gz|zip)' dirlist*.txt
?在圆括号之后加上一个问号,来表示它们将被匹配零次或一次
^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$
echo "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]$'
echo "This works." | grep -E '[[:upper:]][[:upper:][[:lower:]]*.'
This works.
+ 匹配一个或多个元素由一个或多个字母字符组构成的文本行,字母字符之间由单个空格分开
echo "This that" | grep -E '^([[:alpha:]]+ ?)+$'
This that
{}
{n,m} | 匹配前面的元素,如果它至少出现了 n 次,但是不多于 m 次 |
echo "(555) 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$'
(555) 123-4567