Linux Shell编程
一,基础正则表达式
1,正则表达式与通配符
1,正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配,grep,awk,sed等命令可以支持正则表达式
2,通配符用来匹配符合条件的文件名,通配符是完全匹配,ls find cp 这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了
2,基础正则表达式
表达式 | 含义 |
^ | ^word表示匹配以word开头的内容(打印的是一行内容),vi/vim 编辑器里^代表一行的开头 |
$ | word$表示匹配word结尾的内容(打印的是一行内容),vi/vim编辑器里$代表一行的结尾 |
^$ | 表示空行 |
. | 代表且只能代表任意一个字符 |
\ | \.就只代表点本身,转义符号,让有着特殊身份意义的字符,脱掉马甲,还原原形 |
* | 重复0个或多个前面一个字符,例如:0*,有1个0或多个000000 |
.* | 匹配所有字符,延伸^.*以任意多个字符开头,.*$以任意多个字符结尾 |
[abc] | 匹配字符集合内的任意一个字符[a-zA-Z],[0-9](单个字符而不是包含的单词) |
[^abc] | 匹配不包含^后的任意一个字符的内容(单个字符而不是包含的单词);其中括号里^为取反,注意和中括号内以^开头区别 |
a\{n,m\} |
重复n到m次,前一个重复的字符,如果用egrep/sed -r可以去掉斜线; 例子:gerp "0\{3,4\}" syz.log 意思为,0匹配,3-4次 my qq name is 49000448 not 490000048 |
a\{n,\} | 重复至少n次,前一个重复的字符,如果用egrep/sed -r 可以去到斜线 |
a\{n\} |
重复n次,前一个重复的字符,如果用egrep/sed -r 可以去掉斜线 例子:gerp "0\{3\}" syz.log 意思为,0匹配,3次 my qq name is 49000448 |
a\{,m\} |
????Centos5不能用,Centos6、7可以用 例子:gerp "0\{3\}" syz.log 意思为,0匹配,3次 my qq name is 49000448 |
二,字符截取命令
1,cut字段提取命令 (提取符合条件的列)
cut 【选项】文件名 (一般cut 和 grep 配合使用)
选项:
-f 列号:提取第几列
-d 分隔符:按照指定分隔符分割列
2,printf 命令
printf '输出类型输出格式' 输出内容
输出类型:
%ns:输出字符串。n是数字指代输出几个字符
%ni:输出整数,n是数字指代输出几个数字
%m.nf:输出浮点数,m和n是数字,指代输出的整数位数和小数位数,如%8.2f代表共输出8位数,其中两位是小数,6位是整数
hint :在$()中,()执行的内容是一条系统命令
在awk命令的输出中支持print 和 printf命令
1,print:print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
2,printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符
3,awk命令
awk '条件1{动作1} 条件2{动作2} .....' 文件名
条件(pattern):
一般使用关系表达式作为条件
x>10 判断x变量是否大于10
x>=10判断x变量是否大于等于10
x<=10判断x变量是否小于10
动作(Action):
格式化输出
流程控制语句
例如:
awk '{printf $2 "\t" $6 "\n"}' student.txt
df -h | awk '{print $1 "\t" $3}'
hint :print 会自动加换行符
因为cut命令是使用制表符\t来进行分割的,当列分割使用的是空格的时候,想要分割得到列我们就需要使用到awk
例如:
df -h | grep "sda" | awk '{printf $5 "\n" } | cut -d "%" -f 1
awk中的BEGIN
awk ‘ BEGIN {printf "This is a transcript \n"} {printf $2 "\t" $6 "\n"} ’ student.txt
会在处理分割之前先输出一行This is a transcript
awk的FS内置变量 (定义分隔符)
cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"}{printf $1 "\t" $3 "\n"}'
hint:awk处理时是先读入第一行数据再进行处理
awk中的END(与BEGIN相对,在所有数据处理完后执行)
awk 'END {printf "The End \n"}{printf $2 "\t" $6 "\n"}' student.txt
awk中的关系运算符:
cat student.txt | grep -v Name | awk '$6>=87 {printf $2 "\n"}'
4,sed命令
sed是一种几乎包括在所有Unix平台(包括linux)的轻量级流编辑器,sed主要是用来将数据进行选取,替换,删除,新增的命令
sed【选项】'动作' 文件名
选项:
-n 一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕
-e 允许对输入数据应用多条sed命令编辑
-i 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:
a\:追加
c\:行替换
i\:插入
d:删除
p:打印
s:字串替换
例如:
sed -n '2p' student.txt
df -h | sed -n '2p'
sed '2,4d' student.txt
sed '2a zuobi' student.txt 追加在行末
sed '2c No much person' student.txt 数据替换
字符串替换
sed 's/旧字符串/新字符串/g' 文件名
sed '3s/74/99/g' student.txt
三,字符处理命令:
1,排序命令 sort
sort 【选项】文件名
选项:
-f 忽略大小写
-n 以数值型进行排序,默认使用字符串型排序
-r 反向排序
-t 指定分隔符,默认分隔符是制表符
-k n[,m]: 按照指定的字段范围排序,从第n字段开始,m字段结束(默认到行尾)
sort -n -t ":" -k 3,3 /etc/passwd
2,统计命令 wc
wc【选项】文件名
选项:
-l 只统计行数
-w 只统计单词数
-m 只统计字符数
四,条件判断
1,按照文件类型进行判断
-d 文件 判断该文件是否存在,并且是否为目录文件(是目录为真)
-e 文件 判断该文件是否存在(存在为真)
-f 文件 判断该文件是否存在,并且是否为普通文件(是普通文件为真)
-L 文件 判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
例如:
test -e student.txt
echo $?
[ -e student.txt]
[ -d /root ] && echo "yes" || echo "no"
2,按照文件权限进行判断
-r 文件 判断该文件是否存在,并且是否该文件拥有读权限
-w 文件 判断该文件是否存在,并且是否该文件拥有写权限
-x 文件 判断该文件是否存在,并且是否该文件拥有执行权限
test -w student.txt && echo "yes" || echo "no"
3,两个文件之间进行比较
文件1 -nt 文件2 判断文件1的修改时间是否比文件2的新(为新则为真)
文件1 -ot 文件2 判断文件1的修改时间是否比文件2的旧(为旧则为真)
文件1 -ef 文件2 判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件
4,两个整数之间的比较
整数1 -eq 整数2 判断整数1是否和整数2相等(相等为真)
整数1 -ne 整数2 判断整数1是否和整数2不相等(不相等为真)
5,字符串判断
-z 字符串 判断字符串是否为空(为空返回真)
-n 字符串 判断字符串是否为非空(非空返回真)
字符串1 == 字符串2 判断字符串是否相等
字符串1 != 字符串2 判断字符串是否不等
6,多重条件判断
判断1 -a 判断2 逻辑与,判断1和判断2都成立,为真
判断1 -o 判断2 逻辑或,判断1和判断2其一成立,为真
!判断 逻辑非,判断为假的时候 ,!判断为真
五,流程控制
1,if语句
1,单分支if条件语句
if 【条件判断式】;then
程序
fi
或者
if 【条件判断式】
then
程序
fi
单分支条件语句需要注意几个点:
1,if语句使用fi结尾和一般语言使用大括号结尾不同
2,【条件判断式】就是使用test命令判断,所以中括号和判断式之间必须有空格
3,then后面跟符合条件之后执行的程序,可以放在[]之后,用";"分割,也可以换行写入,就不需要";"了
判断分区使用率
#!/bin/bash
rate=$( df -h | grep "/dev/sda1" | awk '{print $5}' | cut -d "%" -f 1)
if [ $rate -ge 80 ];then
echo "warning ! /dev/sda1 is full!"
if
echo "check end"
2,双分支if条件语句
if【条件判断式】
then
条件成立时执行的程序
else
条件不成立时执行的程序
fi
3,多分支if条件语句
if 【条件判断式1】
then
当条件判断式1成立时执行程序1
elif【条件判断式2】
then
当条件判断式2成立时执行程序2
else
当所有条件不成立时,最后执行此程序
fi
2,case语句
多分支case条件语句
case语句和if...elif..else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
*)
如果变量的值都不是以上的值,则执行该程序
;;
esac
3,for循环
语法一:
for 变量 in 值1 值2 值3
do
程序
done
语法二:
for((初始值;循环控制条件;变量变化))
do
程序
done
4,while循环与until循环
1,while循环
while循环是不定循环,也称作条件循环,只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止,这就和for的固定循环不太一样
while 【条件判断式】
do
程序
done
2,until 循环
until循环和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环
until 【条件判断式】
do
程序
done