正则表达式

1. 正则表达式:基本正则表达式与扩展正则表达式

元字符:用于做通配的
grep  :全面搜索正则表达式并打印之
grep  基本正则表达式,不支持扩展表达式
grep -E   支持扩展正则表达式
egrep  与 grep -E 相同
fgrep=gerp -F 不支持正则表达式


grep -v   反向选取,被grep匹配到的不显示,不匹配的显示
grep -i    忽略大小写
grep -A   显示上下文
grep --color=auto(auto自动加颜色) 'root' /etc/passwd     搜索/etc/passwd下的root,并高亮显示

export  GRER_COLOR='01;32'      颜色定制
ls /etc | grep --color=auto 'pass'    搜索带有pass的字符串并高亮显示


2 .1) . :任意单个字符 如: grep 'r..t'  /etc/passwd 
        *   :表示匹配它前面一个字母任意次(注意与globbing文件名通配不一样)
        ? :  匹配零次或一次 a?root (有a无a均可以)
         + :匹配一到任意次
         |: 或者           如  :  like your lover ,love your lover    可以表示为:    l(ik)|(ov)e your lover (出现ik或者ov)
         .*   :匹配任意长度的任意字符  如:r.*t  :rt,rrt,rrrt 均可匹配
2)r\{n\} 次数 精确匹配 :  a\{2\}root 匹配a两次: aaaroot

     r\{m,n\} 次数范围匹配  :   a\{0,2\}root 匹配a零到二次:aroot aaroot aaaroot

    r\{n,\}  次数至少匹配 :  a\{2,\}root   匹配a至少两次

 


3)锚定符:
^root   root必须出现在行首
root$    root必须出现在行尾
 [ ]指定选择字符的范围,匹配任意单个字符  如: [abc]root abc至少出现一个 aaroot也匹配(只匹配aroot这一段)
[^abc]root     除了abc以外的任一个后面跟root

锚定单词:
\<  词首定位符 \<root  root必须出现在词首 root1匹配,aroot不匹配

\> 词尾定位符 root\>  root必须出现在词尾  root1不匹配,aroot匹配

\<root\>  精确匹配root这个单词
\broot  词首匹配
root\b  词尾匹配
\broot\b精确匹配root这个单词
\Broot\B  不匹配


\(..\)  字符串次数匹配 
love  your lover : \(love\).*\1r 以love开始lover结束,中间跟任意字符(\1引用括号内内容)
like your liker,love  your lover   \(like\).*\1r.*\(love\).*\2r
\(root\).*\1    \1表示引用第一个括号内容  
 
3.cut:切割命令

l(ov){1,3}er  匹配ov一次到三次
cut -d: -f1 /etc/passwd   每行的以:分割的第一段,切割/etc/passwd目录下的第一段,即显示用户名那一段
cut -d: -f1 /etc/passwd  |grep "\<student\>" 先切割再进行搜索,最后显示student用户
cut -d' '-f2     每行以空格分割的第二行
egrep 'r.{2}'t /etc/passwd 匹配两次中间出现两个字符即可


4.wc : 统计

-l  统计行
-w   统计单词
-c 字节(字符)

ls -l /etc |grep -v "total"|wc -l 统计etc下有多少命令

5.sort 排序不影响原文件

sort常见参数

-o :把结果保存在某个文件中
-r (reverse):逆序显示
-n :以数值大小排序
-f :忽略大小写
-u :排序结束去掉重复行

-t : -k  默认以空格分割 ,-k 表比较第几段
如:sort -n(数值比较) -t : -k 3 /etc/passwd  第三段以数值排列

6.uniq 去掉紧挨着重复的行 sort a.txt |uniq 先排序在去除重复行
uniq  -c 显示重复的次数 
实例:sort 文件 | uniq -c
-u  只显示不重复的行
-d 显示重复的行

cut -d: -f7 /etc/passwd |sort |grep -V "^$"(去除空白行)|uniq 切割/etc/passwd目录下的第七段,进行排序,然后去除空白行,


7.条件判断:
1)三种表达方式;
test expression 或者 [ expression ]  或者[[ expression ]]

test expression   :  test 1 -gt 2
[ expression ]  :    [ 1 -gt 2 ]  注意两端空格

[[ expression ]] :   [[ 1 -gt 2 ]]

2)链接条件的:
-a 与
-o 或
! 非,取反

如:A=2,B=4,C=5  [ $B -gt $A -a $B -gt $C ]  4大于2并且4大于5  结果为1
                                [ $B -gt $A -o $B -gt $C ]  4大于2或者4大于5  结果为0
                                 [ ! $B -gt $A ]

3)短路操作符,连接命令的:
条件测试,测试对象对象必须为完整的语句
&& [ $B -gt $A ] && [ $B -gt $C ]  前面为假,结果一定为假,不需要在判断后面的
||  [ $B -gt $A ] || [ $B -gt $C ] 前面为真,结果一定为真
如:[ 2 -gt 3 ] && echo "2 is max" 前面为假,结果一定为假,不再执行后面的echo语句
       [ 2 -gt 3 ] && echo "3 is max"  前面为假,继续执行后面的echo语句

cut -d: -f1 /etc/passwd |grep "^student$" && echo "student exist"  如果student存在执行echo语句,否则不执行

cut -d: -f1 /etc/passwd |grep "^student$" && echo "student exist" ||echo "student not exist" 如果student不存在,执行echo “student notexist”

比较两个数的大小,显示最大数
#!/bin/bash
[ $1 -gt $2 ] && echo "$1 is the MAX" || echo "$2 is the MAX"
./a.sh 1 2

4)条件测试:

整数测试
 
-gt  大于
-lt  小于
-ge  大于等于
-le  小于等于
-eq   等于
-ne  不等于
>  >=  不能在[ ]中用,但能在(())中应用 如(($A > $B))


5)字符串测试

=
!=
>
<
-z  一个字符串长度为0,即空,空为真
-n    空为假,不空为真

6)文件测试
-e     存在
-f      是否为普通文件
-d      是否为目录
-r      读
-w      写
-x      执行

-L/-h  FILE :  测试一个文件是否为符号链接文件
—O    FILE     : 测试文件属主是否是脚本执行者
-G       FILE        属组是否为你所属的组

如:判断tmp目录下不存在一个文件a
[ ! -e /tmp/a ]

判断tmp目录下不存在一个目录dir,且dir文件也不存在,创建dir这个目录
[ !-e /tmp/dir ] && mkdir /tmp/dir

8.比较两个文件的不同:
diff/patch:


diff:生成补丁的工具
patch:补补丁的工具

diff vimrc vimrc2 > vimrc.pacth 比较不同,把结果生成补丁
9.aspell check file :检查单词

look  查词库
look  head  查询所有以head开头的

10.sed   (stream edit)非交互式编辑器,行编辑器,逐行处理
sed '/root/p' /etc/passwd  搜索/etc/passwd下的包含root的字符串并显示
sed '/root/p' /etc/passwd |uniq -d   只显示重复行

sed -n  '/root/p' /etc/passwd    只显示匹配到的行

sed '/root/d' /etc/passwd   删除

sed 's/root/ROOT/' /etc/passwd  搜索root,替换为ROOT (默认替换每行第一个)

sed 's/root/ROOT/g' /etc/passwd   替换每行的所有root

sed '1,5s/root/ROOT/g' /etc/passwd   指定1-5行

sed '10,$s/root/ROOT/g' /etc/passwd  指定10到最后一行

sed '/root/,/student/s/root/ROOT/g' /etc/passwd  第一个出现root行到第一次出现student的行

选项-i 直接编辑源文件

sed -i 's/root/ROOT/g' /etc/passwd   (g全局,i忽略大小写;g与i用法一样)

追加:
i:行之前加入一行 #sed 's/root/i\enable =0' /etc/passwd
a:行之后加入一行         #sed 's/root/a\enable =0' /etc/passwd


加入多行,用换行符\n    #sed 's/root/a\A =2\n B=3' /etc/passwd


选项:
-e  指定多个操作
sed -e 's/root/ROOT/g' -e 's/student/STUDENT/g' /etc/passwd

-f  从文件中读取条件

sed -f  a.txt /etc/passwd


 

你可能感兴趣的:(职场,shell脚本,休闲)