通配符一般是用于匹配符合条件的文件名(例如:ls fei*hai),而正则表达式则一般是用于在文件中匹配符合条件的字符串。
通配符是完全匹配,而正则表达式则是包含匹配。例如命令find . -name "abc?"找到的文件都是以abc开头的4字母长度的文件,而命令grep "size" canvas.conf找到的则是所有含有size的字符串。包含匹配:只要行内存在匹配成功的,该行整个就会被选中。
正则表达式又分基础正则表达式和扩展正则表达式
基础正则表达式:元字符 * . ^ $ [] [^] \ \{n\} \{n,\} \{n,m\}
命令grep "aa*" test.txt是匹配包含一个a,且其后跟0个或任意多个a的字符串。星号前面的a是用于指明可能出现重复的字符。
元字符只能匹配一个字符,命令grep ".*" test.txt是匹配所有字符。"a\{n\}":转义字符(\)使大括号({和})仅仅代表大括号,n为数字,例如:"a\{8\}"表示的意义是匹配a字母连续出现8次的字符串;"[0-9]\{5\}"表示匹配包含5个连续数字的字符串;"a\{8,\}"表示的意义是匹配a字母连续出现8次以上的字符串;"a\{8,10\}"表示的意义是匹配a字母连续出现8到10次的字符串。
扩展正则:元字符 ? ()
================shell下使用正则表达式和通配符的命令
cut截取:
使用cut命令时默认使用的切割符是制表符;如果人为指定空格为切割符且在空格分布不均匀的情况下,可能会切割不准确。cut -d -f
awk截取:
该命令甚至支持在其中进行逻辑处理(if,while判断,函数调用...),实现流程控制。支持print和printf.
命令格式:awk '条件1{动作1}条件2{动作2}...';
其中条件一般使用关系表达式作为条件(x>10,x>=10,x<=10);
动作可以是格式化输出(print,printf),流程控制语句(if, while,函数调用...);例如:awk '{printf $1 "\t"}' test.txt;
命令详解:读取test.txt文件中的一行,判断条件执行动作,处理完所有的行后才进行下一步动作,文件无论是在处理前还是在处理后,始终都是作为一个整体而存在,在awk外无法获取文件的某一行,在awk命令的内部才能获取文件的某一行。条件可以是:BEGIN(这个条件比较重要在进行数据处理之前就执行BEGIN后的动作,例如命令:cat /etc/passwd | grep /bin/bash | awk '{FS=":"}{printf $1 "\t" $3}' 输出的第一行就不是按照格式化的要求输出,因为awk的原理是先读入数据在执行指明的动作,此时将分割符指定为冒号为时以晚,如果改用awk 'BIGIN{FS=":"}{printf $1 "\t" $3}则在读入之前就现执行动作FS=":",此时第一行就不会存在格式错误了。
awk默认的数据输入来源是标准输出,除非用管道重定义输入
printf格式化输出,无论输出啥都要事前规定输出格式。不支持数据流格式,即命令cat test.txt | printf会报错。
命令格式:printf '输出格式' 输出内容;如果输出内容中存在\t,\n等等字符,需要用单引号将这些字符括起来,当在awk中由于最外面有单引号,所以这个时候这些字符就必须用双引号括起来。
sed截取(严格上讲sed属于字符替换[一般意义上的替换,删除,修改,增加]命令)。
命令格式:sed 选项 '动作' 文件名;选项有-n -i -e;动作有:a,c,i,p,s。在动作前面可以加指定的行号,例如命令sed -n '2,4d' test.txt表示删除test.txt文件中第2到第4行的内容。【sed命令和vi有很多相似之处,vi是用于人机交互,而sed是用于脚本shell】
----------------字符处理命令:sort命令,wc命令
排序命令sort:命令格式:sort 选项 文件名;选项有-f,-n,-r,-t,-k n[,m]。默认的分割符是制表符。
统计命令wc:命令格式:wc 选项 文件名;选项有-i,-w,-m。