正则表达式
linux正则和通配符的区别
通配符:用来匹配符合条件的文件名,通配符是完全匹配。ls,find,cp这些命令不支持正则表达式
正则表达式:用来在文件中匹配符合条件的字符串,正则是包含匹配。grep,awk,sed等命令可以支持正则表达式。
linux通配符
元字符 | 作用 |
---|---|
* | 匹配0个或任意多个字符,也就是可以匹配任何内容 |
? | 匹配任意一个字符 |
[] | 匹配[ ]中任意一个字符 |
[-] | 匹配括号中任意一个字符,-代表一个范围,例如:[a-z]代表匹配一个小写字母 |
[^] | 逻辑非,表示匹配不是中括号内的一个字符,例如[^0-9]代表匹配一个不是数字的字符 |
linux基础正则表达式
元字符 | 作用 |
---|---|
* | 前一个字符匹配0次或任意多次,匹配0次前一个字符则表示匹配任意字符,包括空白行 |
. | 匹配除了换行符以外任意一个字符,“.*”匹配所有内容 |
^ | 用于指定匹配字符串的头部,也称行首定位符;匹配行首。例如:^hello会匹配以hello开头的行,grep -n “^$” test.txt匹配空白行并显示行号 |
|用于指定匹配字符串的尾部,也称行尾定位符;匹配行尾。例如:hello
会匹配以hello结尾的行
[ ] |匹配中括号中指定的任意一个字符,只匹配一个字符,要匹配[则要转义[
[^] | 匹配除中括号的字符以外的任意一个字符
\ |转义符用于取消特殊符号的含义,匹配包含以.结尾的行grep “.$” test.txt
\{n\}| 表示其前面的字符恰好出现n次。例如:[0-9]{4}匹配4位数字,但注意添加两边的定界符,以精确匹配
\{n,\} | 表示其前面的字符出现不小于n次。例如:[0-9]{2,}匹配2位以上的数字
\{n,m\} | 表示其前面的字符至少出现n次,最多出现m次。例如:[a-z]{6,8}匹配6到8位的小写字母
- 注1:“?”、“ ()”是扩展正则中的元字符
- 注2:正则表达式中使用以上的元字符,如[]、{}、*、. 等所以在匹配字符串中包含有这些元字符时必须使用反斜杠(“\”)转义,但像<>这个非元字符符号就不需要转义。
字符截取命令
cut命令
- 格式:cut [选项] 文件名
- 选项:
- -f 列号: 提取第几列
- -d 指定分隔符:按指定的分隔符分割分割列(不能使用空格作为分割符)
printf命令
- printf ‘输出的类型输出格式’ 输出内容
- 输出类型:
%-5s 格式为左对齐且宽度为5的字符串代替(-表示左对齐),不使用则是又对齐
%-4.2f 格式为左对齐宽度为4,保留两位小数 - 输出格式:
\a 警告字符,通常为ASCII的BEL字符
\b 后退
\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f 换页(formfeed)
\n 换行
\r 回车(Carriage return)
\t 水平制表符
\v 垂直制表符
awk
awk的工作原理
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
第一步:执行BEGIN{ commands }语句块中的语句;
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{ commands }语句块。
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。
END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。
awk常用命令选项
-F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
-f scripfile 从脚本文件中读取awk命令
-m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
awk print与printf的差别
printf:可以自定义输出的模式,另外输出内容之后不自动换行
print:输出内容之后自动换行
awk经典例子
统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
#awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh
filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh
filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh
使用printf替代print,可以让代码更加简洁,易读
#awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
以上两种方式所得结果相同!
sed命令
sed的处理过程
sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。
前面说到sed不会修改文件,那么现在我们可以知道是为什么了?是因为sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。
补充知识:
在使用sed的过程中,我们经常会听到“定址”,那么什么是“定址”呢?
定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。
1、地址是一个数字,则表示行号;是“$”符号,则表示最后一行。
例如:
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
sed -n '3p' datafile #只打印第三行
- 2、只显示指定行范围的文件内容
例如:
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
sed -n '100,200p' mysql_slow_query.log # 只查看文件的第100行到第200行
- 3、地址是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两行在内)。范围可以用数字、正则表达式、或二者的组合表示。
例如:
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
sed '2,5d' datafile
#删除第二到第五行
sed '/My/,/You/d' datafile
#删除包含"My"的行到包含"You"的行之间的行
sed '/My/,10d' datafile
#删除包含"My"的行到第十行的内容
sed命令和选项
sed命令告诉sed如何处理由地址指定的各输入行,如果没有指定地址则处理所有的输入行。
1、sed命令
命令 | 功能 |
---|---|
a\ | 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行 |
c\ | 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用”\”续行 |
i\ | 在当前行之前插入文本。多行时除最后一行外,每行末尾需用”\”续行 |
d | 删除行 |
h | 把模式空间里的内容复制到暂存缓冲区 |
H | 把模式空间里的内容追加到暂存缓冲区 |
g | 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容 |
G | 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面 |
l | 列出非打印字符 |
p | 打印行 |
n | 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理 |
q | 结束或退出sed |
r | 从文件中读取输入行 |
! | 对所选行以外的所有行应用命令 |
s | 用一个字符串替换另一个 |
g | 在行内进行全局替换 |
w | 将所选的行写入文件 |
x | 交换暂存缓冲区与模式空间的内容 |
y | 将字符替换为另一字符(不能对正则表达式使用y命令) |
2、sed选项
选项 | 功能 |
---|---|
-e | 进行多项编辑,即对输入行应用多条sed命令时使用 |
-n | 取消默认的输出 |
-f | 指定sed脚本的文件名 |
sed的退出状态
sed不向grep一样,不管是否找到指定的模式,它的退出状态都是0。只有当命令存在语法错误时,sed的退出状态才不是0。
http://blog.csdn.net/engledb/article/details/19623087
排序命令sort
sort [选项] 文件名
-f, --ignore-case 忽略字母大小写
-g, --general-numeric-sort 按照常规数值排序
-i, --ignore-nonprinting 只排序可打印字符
-n, --numeric-sort 根据字符串数值比较
-r, --reverse 逆序输出排序结果
-k, --key=位置1[,位置2] 在位置1 开始一个key,在位置2 终止(默认为行尾)
-t, --field-separator=分隔符 使用指定的分隔符代替非空格到空格的转换
条件判断
两种判断格式
test 选项 文件名
[ 选项 文件名 ]
按照文件类型进行判断
[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。
[ -e FILE ] 如果 指定的文件或目录存在时返回为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。
[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块文件则返回为真。
[ -c FILE ] 如果 FILE 存在且是一个字符文件则返回为真。
[ -h FILE ] 如果 FILE 存在且是一个符号符号链接文件则返回为真。(该选项在一些老系统上无效)
[ -p FILE ] 如果 FILE 存并且是命令管道时返回为真。
[ -s FILE ] 如果 FILE 存在且大小非0时为真则返回为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则返回为真。
[ -G FILE ] 如果 FILE 存在且默认组为当前组则返回为真。(只检查系统默认组)
[ -L FILE ] 如果 FILE 存在且是一个符号连接则返回为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则返回为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则返回为真。
按照文件权限进行判断
[ -r FILE ] 如果 FILE 存在且是可读的则返回为真。
[ -w FILE ] 如果 FILE 存在且是可写的则返回为真。(一个目录为了它的内容被访问必然是可执行的)
[ -x FILE ] 如果 FILE 存在且是可执行的则返回为真。
[ -g FILE ] 如果 FILE 存在且设置了SGID则返回为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID位时返回为真。
[ -k FILE ] 如果 FILE 存在且已经设置了冒险位则返回为真。
两个文件之间进行比较
[ FILE1 -nt FILE2 ] 如果 FILE1 比 FILE2 新, 或者 FILE1 存在但是 FILE2 不存在则返回为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 老, 或者 FILE2 存在但是 FILE1 不存在则返回为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则返回为真。
两个整数之间进行比较
[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>
[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=
[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<
[ INT1 -le INT2 ] INT1小于等于INT2返回为真,<=
两个字符串之间进行比较
[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真
[ STRING1 ] 如果字符串不为空则返回为真,与-n类似
[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真
[ STRING1 != STRING2 ] 如果字符串不相同则返回为真
[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。
[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。
多重条件判断
[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[ ] || [ ] 用OR来合并两个条件
[ ] && [ ] 用AND来合并两个条件
流程控制
if语句
单分支、双分支、多分支
if [] ;then
fi
if [] ;then
else
fi
if [] ;then
elif
elfi
else
fi
case语句
case $变量名 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
*)
默认执行的命令序列
;;
esac
for循环
1)循环体前用in,循环体用{ }大括号括起来,然后用do和done。
2)不带列表的for循环,for后直接跟条件,然后用do和done。
3)类C风格的for循环,for后边用(())两层双括号括住条件,条件之间用;分号隔开,然后用do和done。
#!/bin/bash
#打印1~5的for语句
for i in {1..5};do #数字段形式
echo $i
done
for i in 1 2 3 4 5;do #详细列出(字符且项数不多)
echo $i
done
for ((i=1;i<=5;i++));do #((语法循环--有点像C语法,但记得双括号
echo $i
done
for i in `seq 5`;do #seq形式 起始从1开始,sequence序列
echo $i
done
while循环
while循环语句也称前测试循环语句,它的循环重复执行次数,是利用一个条件来控制是否继续重复执行这个语句。while语句与for循环语句相比,无论是语法还是执行的流程,都比较简明易懂。
while循环格式如下:
while expression
do
command
command
…
done
until循环
until循环 测试条件
do
语句1
语句2
done
条件不满足循环,直到满足就退出循环;
- 1.练习:提取 df -h的命令的根分区的使用率,如果大于80%,输出提示信息!
- 2.备份数据库文件
- 3.判断Apache是否启动!
- 批量的解压缩(for)
- 批量添加指定数量的用户