1.基础正则表达式
1).正则表达式与通配符
>正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep,awk,sed等命令可以支持正则表达式.
>通配符用来匹配符合条件的文件名,通配符是完全匹配.ls,find,cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了.
2).基础正则表达式
* :前一个字符匹配0次或任意多次
. :匹配除了换行符外任意一个字符
^:匹配行首.例如:^hello会匹配以hello开头的行
$:匹配行尾.例如:hello&会匹配以hello结尾的行
[]:匹配中括号中指定的任意一个字符,只匹配一个字符.例如:[aoeiu]匹配任意一个元音字母,[0-9]匹配任意一位数字,[a-z][0-9]匹配小写字和一位数字结构的两位字符.
[^]:匹配除中括号的字符以外的任意一个字符.例如:[^0-9]匹配任意一位非数字字符,[^a-z]表示任意一位非小写字母.
\:转义符.用于取消将特殊符号的含义取消.
\{n\}:表示其前面的字符恰好出现n次.例如:[0-9]\{4\}匹配4位数字,[1][3-8][0-9]\{9\}匹配手机号码.
\{n,\}:表示其前面的字符出现不小于n次.例如:[0-9]\{2,\}表示两位及以上的数字.
\{n,m\}:表示其前面的字符至少出现n次,最多出现m次.例如:[a-z]\{6,8\}匹配6到8位的小写字母.
2.1).例子
grep "a*" aaa.txt【匹配所有内容,包括空白行】
grep "aa*" aaa.txt【匹配至少包含有一个a的行】
grep "aaa*" aaa.txt【匹配最少包含两个连续a的字符串】
grep "aaaaa*" aaa.txt【则会匹配最少包含四个连续a的字符串】
grep "s..d" aaa.txt【"s..d"会匹配在s和d这两个字母之间一定有两个字符的单词】
grep "s.*d" aaa.txt【匹配在s和d字母之间有任意字符】
grep ".*" aaa.txt【匹配所有内容】
grep "^M" aaa.txt【匹配以大写"M"开头的行】
grep "n$" aaa.txt【匹配以小写"n"结尾的行】
grep -n "^$" aaa.txt【会匹配空白行】
grep "s[ao]id" aaa.txt【匹配s和i字母中,要么是a,要么是o】
grep "[0-9]" aaa.txt【匹配任意一个数字】
grep "^[a-z]" aaa.txt【匹配用小写字母开头的行】
grep "^[^a-z]" aaa.txt【匹配不用小写字母开头的行】
grep "^[^a-zA-Z]" aaa.txt【匹配不用字母开头的行】
grep "\.$" aaa.txt【匹配使用"."结尾的行】
grep "a\{3\}" aaa.txt【匹配a字母连续出现三次的字符串】
grep "[0-9]\{3\}" aaa.txt【匹配包含连续的三个数字的字符串】
grep "^[0-9]\{3,\}[a-z]" aaa.txt【匹配最少用连续三个数字开头的行】
grep "sa\{1,3\}i" aaa.txt【匹配在字母s和字母i之间有最少一个a,最多三个a】
2.字符截取命令
1).cut字段提取命令
cut [选项] 文件名【-f 列号:提取第几列,-d 分隔符:按照指定分隔符分割列 -c 以字符的单位取出固定的字符区间】
eg:1.-d -f

2.-c

2).printf命令 (格式化打印命令)
printf '输出类型 输出格式' 输出内容
输出类型:
%ns:输出字符串.n是数字指代输出几个字符
%ni:输出整数.n是数字指代输出几个数字
%m.nf:位数和小数位数.如%8.2f代表共输出8位数,其中2位是小数,6位是整数
输出格式:
\a:输出警告声音
\b:输出退格键,也就是Backpace键
\f:清除屏幕
\n:换行
\r:回车,也就是Enter键
\t:水平输出退格键,也就是Tab键
\v:垂直输出退格键,也就是Tab键
eg:

3).awk命令---【具体用法建议百度】
①.awk '条件1{动作1} 条件2{动作2}...' 文件名【awk '{printf $2 "\t" $6"\n"}' temp.txt】
条件:
一般使用关系表达式作为条件
x>10 判断变量x是否大于10
x>=10 大于等于
x<=10 小于等于
动作:
格式化输出
流程控制语句
②.awk 'BEGIN{printf "hello world\n"}{printf $2 "\t" $6"\n"}' temp.txt【BEGIN优先执行一段输出】
③.awk 'END{printf "hello world\n"}{printf $2 "\t" $6"\n"}' temp.txt【所有数据处理完之后,再执行end命令的输出】
④.cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"}{printf $2 "\t" $6"\n"}'【FS内置变量,指定分隔符,默认为空格和【tab】】
⑤.cat temp.txt | grep -v name | awk '$6>=87 {printf $2 "\n"}'【关系运算符】
eg:
1.

2. 查询分区使用率超过10%的分区名称 和 百分比数值
命令:df -h | grep -v Filesystem | awk '{print $1"%"$5}' | awk 'BEGIN{FS="%"} BEGIN{print "is gt 10%"} END{print "the end"}
$2>10{print $1 "\t" $2}'

4).sed命令
①.sed命令
sed是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器.sed主要是用来将数据进行选取,替换,删除,新增的命令.
②.sed [选项] '[动作]' 文件名【sed -n '2p' temp.txt】
选项:
-n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕.
-e:允许对输入数据应用多条sed命令编辑.
-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出.
动作:
a:追加,在当前行后添加一行或多行.添加多行时,除最后一行外,每行末尾需要用"\"代表数据未完结
c:行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需要用"\"代表数据未完结
i:插入,在当期行前插入一行或多行.插入多行时,除最后一行外,每行末尾需要用"\"代表数据未完结
d:删除,删除指定的行
p:打印,输出指定的行
s:字串替换,用一个字符串替换另外一个字符串.格式为"行范围s/旧字串/新字串/g"(和vim中的替换格式类似)
3.字符处理命令
1).排序命令sort
sort [选项] 文件名
-f:忽略大小写
-n:以数值型进行排序,默认使用字符串型排序
-r:反向排序
-t:指定分隔符,默认是分隔符是制表符
-k n[,m]:按照指定的字段范围排序.从第n字段开始,m字段结束(默认到行尾)
eg:
1.

2.

2).uniq
-i:忽略大小写字符的不同
-c:统计行数
eg:

3).统计命令wc
wc [选项] 文件名
-l:只统计行数
-w:只统计单词数
-m:只统计字符数
eg:

4.双向重定向tee
语法:tee [选项] 文件名
-a 以追加的方式重定向到文件中
eg:

解释:tee会同时将数据流送与文件与屏幕
5.字符转换命令
1)tr 可以用来删除一段信息当中的文字,或者是进行文字信息的替换
语法:tr [-ds] SET 1 ...
-d : 删除信息当中的SET1 这个字符串;
-s : 替换掉重复的字符串
eg:
1.

2.

2).paste
解释:paste将两个文件的两行贴在一起,且中间以【tab】键隔开
eg:

6.切割命令split
解释:将一个大的文件依据文件大小或行数来切割成为小的文件
7.条件判断
1).按照文件类型进行判断【[ -f /tmp/temp.txt ] && echo "yes" || echo "no"】
判断方式:1.test 选项 文件或目录 2. [ 选项 文件或目录]
测试选项 | 作用
------------------------------------------------------------------------
-b 文件 |判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
-c 文件 |判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
-d 文件 |判断该文件是否存在,并且是否为目录文件(是目录为真)
-e 文件 |判断该文件是否存在(存在为真)
-f 文件 |判断该文件是否存在,并且是否为普通文件(是普通文件为真)
-L 文件 |判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
-p 文件 |判断该文件是否存在,并且是否为管道文件(是管道文件为真)
-s 文件 |判断该文件是否存在,并且是否为非空(非空为真)
-S 文件 |判断该文件是否存在,并且是否为套接字文件(是套接字文件为真 )\
2).按照文件权限进行判断【[ -r /tmp/temp.txt ] && echo "yes" || echo "no"】
判断方式:1.test 选项 文件或目录 2. [ 选项 文件或目录]
测试选项 | 作用
------------------------------------------------------------------------
-r 文件 |判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)
-w 文件 |判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)
-x 文件 |判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)
-u 文件 |判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真)
-g 文件 |判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真)
-k 文件 |判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真)
3).两个文件之间进行比较【[ /tmp/temp.txt -nt /tmp/temp.txt ] && echo "yes" || echo "no"】
测试选项 | 作用
------------------------------------------------------------------------
文件1 -nt 文件2 |判断文件1的修改时间是否比文件2的新(如果新则为真)
文件1 -ot 文件2 |判断文件1的修改时间是否比文件2的旧(如果旧则为真)
文件1 -ef 文件2 |判断文件1是否和文件2的inode号一致,可以理解为两个文件是否为同一个文件.这个判断用于判断硬链接是很好的方法.
4).两个整数之间比较【[ 22 -eq 23 ] && echo "yes" || echo "no"】
测试选项 | 作用
------------------------------------------------------------------------
整数1 -eq 整数2 |判断整数1是否和整数2相等(相等为真)
整数1 -no 整数2 |判断整数1是否和整数2不相等(不相等为真)
整数1 -gt 整数2 |判断整数1是否大于整数2(大于为真)
整数1 -lt 整数2 |判断整数1是否小于整数2(小于为真)
整数1 -ge 整数2 |判断整数1是否大于等于整数2(大于等于为真)
整数1 -le 整数2 |判断整数1是否小于等于整数2(小于等于为真)
5).字符串的判断【[ -z temp ] && echo "yes" || echo "no"】
测试选项 | 作用
------------------------------------------------------------------------
-z 字符串 |判断字符串是否为空(为空返回真)
-n 字符串 |判断字符串是否为非空(非空返回真)
字串1 == 字串2 |判断字符串1是否和字符串2相等(相等返回真)
字串1 != 字串2 |判断字符串1是否和字符串2不相等(不相等返回真)
6).多重条件判断【[ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"】
测试选项 | 作用
------------------------------------------------------------------------
判断1 -a 判断2 |逻辑与,判断1和判断2都成立,最终的结果才为真
判断1 -o 判断2 |逻辑或,判断1和判断2有一个成立,最终的结果就为真
! 判断 |逻辑非,使原始的判断式取反
8.流程控制
1).if语句
①.单分支if条件语句
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
-----------------------------------
单分支条件语句需要注意几个点
>if语句使用fi结尾,和一般语言使用大括号结尾不同
>[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格.
>then后面跟符合条件之后执行的程序,可以放在[]之后,用";"分割.也可以换行写入,就不需要";"了.
②.双分支if条件语句
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
③.多分支if条件语句
if [ 条件判断式1 ]
then
条件成立时,执行的程序
exit 1
elif [ 条件判断式2 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
2).case语句
①.多分支case条件语句
>case语句和if...elif...slse语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系.
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
3).for循环
①.语法一
for 变量 in 值1 值2 值3 ...
do
程序:echo "hello"
done
②.语法二
for (( 初始值;循环控制条件;变量变化))
do
程序
done
4).while循环
①.while循环
>while循环是不定循环,也称作条件循环.只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止.这就和for的固定循环不太一样了.
格式:
while [ 条件判断式 ]
do
程序
done
②.until循环
>until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序.一旦循环条件成立,则终止循环.
格式:
until [ 条件判断式 ]
do
程序
done