test和[]:测试
- 判断文件
test -e #判断是否存在 -d #判断是否为目录 -f #判断是否为文件 -r -w -x test -f /usr/local/mongodb/etc/mongod.conf echo $?
- 判断整数
test -gt -ge -lt -le -eq -ne test 9 -gt 6 echo $?
- 判断字符串
test ==、= != -z 是否为空 -n 是否不为空 -e 判断变量是否存在 a='' test -z $a echo $?
- 组合条件组合条件 -a
test 9 -gt 7 -a 5 -gt 3 [ 9 -gt 7 -a 5 -gt 3 ] [[ 9 -gt 7 && 5 -gt 3 ]] echo $?
-otest 9 -gt 7 -o 5 -gt 3 [ 9 -gt 7 -o 5 -gt 3 ] [[ 9 -gt 7 || 5 -gt 3 ]] echo $?
- 取反:!
[ ! 9 -gt 7 ] echo $?
数值操作
- 整数运算
- expr
a=`expr 8 + 7` b=`expr 8 \* 7`
- $[]
a=$[8+7] a=$[8*7]
- let
a=12 b=13 let c=a+b echo $c
- expr
- 随机数
a=$RANDOM b=$[$RANDOM*$RANDOM] c=$[$RANDOM%10+1]
- 整数序列
sep 10 seq 1 100 seq 1 2 100 seq -w -s ',' 20
- 小数运算(download:http://rpmfind.net/linux/centos/7.5.1804/os/x86_64/Packages/bc-1.06.95-13.el7.x86_64.rpm)
re=`echo "scale=4;2.1*3.4" | bc` echo $re a=12 b=13 echo "$a>$b" | bc echo "$a<$b" | bc
字符串操作
- 字符串截取
- sbustr
data_date='2018-06-05 15:46:34' year=`expr substr "$data_date" 1 4`
- cut
data_date='2018-06-05 15:46:34' month=`echo "$data_date" | cut -c 6-7` day=`echo "$data_date" | cut -d '-' -f 3 | cut -d ' ' -f 1`
- ${::}
data_date='2018-06-05 15:46:34' year=${data_date:0:4} 或 year=${data_date::4} month=${data_date:5:2}
- sbustr
- 字符串替换
- ${//}
data_date='2018-06-05 15:46:34' re=`echo ${data_date/-/#}` re2=`echo ${data_date//-/#}`
- tr单个字符替换
astr="hello world" echo $astr | tr 'heo' 'ZXY' echo $astr | tr -d 'heo'
- ${//}
- 获取随机字符串
echo $RANDOM | md5sum | cut -c 1-8 uuidgen | md5sum | cut -c 1-8 head -1 /dev/urandom| md5sum | cut -c 1-8
- shell识别路径和文件名
- dirname
dirname '/home/hadoop/tmp/1.txt'
- basename
basename '/home/hadoop/tmp/1.txt'
- dirname
重定向
- 输入重定向
- 输出重定向
- 标准输出
- 覆盖
ll /tmp > /home/hadoop/tmp/1 或 ll /tmp 1> /home/hadoop/tmp/1
- 追加
ll /tmp >> /home/hadoop/tmp/1 或 ll /tmp 1>> /home/hadoop/tmp/1
- 覆盖
- 错误输出
- 覆盖
lld /tmp > /home/hadoop/tmp/2 或 lld /tmp 2> /home/hadoop/tmp/2
- 追加
lld /tmp >> /home/hadoop/tmp/2 或 lld /tmp 2>> /home/hadoop/tmp/2
- 覆盖
- 混合输出
- 覆盖
ll /tmp 1> /home/hadoop/tmp/11 2> /home/hadoop/tmp/22 ll /tmp &> /home/hadoop/tmp/33
- 追加
ll /tmp 1>> /home/hadoop/tmp/11 2>> /home/hadoop/tmp/22 ll /tmp &>> /home/hadoop/tmp/33
- 覆盖
- 标准输出
逻辑分割符
- &&
make && make install
- ||
id user1 || useradd user1
- && || 组合使用
AA && BB || CC //如果AA成功,则执行BB,否则执行CC;相当与if三目运算符,但如果BB执行失败了,CC还会执行
shell变量
- 环境变量
- env:列出所有环境变量
- set:列出所有变量
- 位置变量
- shell 保存shell脚本参数的变量:$1、$2...
- 预定义变量
- bash内置的特殊变量,可以调用但不能赋值:$? $# $*等
- 自定义变量
- 全局变量
- export修饰的变量,当前shell和子shell可以访问
- 局部变量
- 当前shell可以访问,但子shell不可以访问
- 删除变量
- 删除局部变量
a=12 unset a
- 删除出全局变量
export B=12 export -n B 并非删除,而是取消B的全局属性
- 删除局部变量
- 全局变量
正则表达式
- 基本元字符
^ #匹配行首 $ #匹配行尾 . #单个个字符 + #最少匹配一次 ? #最多匹配一次 * #匹配任意次 {} {n} #匹配n次 {n,m} #匹配n~m次 {n,} #匹配至少n次 [] [a-z] #匹配任意的小写字母 [^abc] #匹配除abc的任意字符
- 其他元字符
() #组合为整体 | #或者 \b #匹配单词边界 \< #匹配单词开头 \> #匹配单词结尾
awk
- wak执行脚本
awk -f xxx.zak
- awk格式:
awk [选项] '[条件]{编辑指令}' file awk -F ':' '{print $1,$2,$3}' passwd
- awk条件表示
- 正则表达式
- ~ #匹配
- !~ #不匹配
awk -F ':' '/^bin/ {print $0}' passwd awk -F ':' '$0 ~ /^bin/ {print $0}' passwd awk -F ':' '$0 !~ /^bin/ {print $0}' passwd
- 数值/字符串
awk -F ':' '$3 > 1 {print $0}' passwd awk -F ':' '$1 == "bin" {print $0}' passwd
- 逻辑比较
awk -F ':' '$3>1 && $1=="mail" {print $0}' passwd
- 运算符
awk -F ':' 'BEGIN{i=0}{i+=NF}END{print i}' passwd
- 正则表达式
- awk内置变量
FS #保存或设置分隔符 $n· #第n个字段 $0 #当前读取的整行文本 NF #当前行的字段个数 NR #当前已读入行的行号 FNR #原文本中的行号 FILENAME #当前处理文件的文件名 ENVIRON #调用shell环境变量
- BEGIN和END
awk -F ':' 'BEGIN{print"welcome to wak"}{print $1,$1,$2,$3}END{print "this program is end"}' passwd
- awk流程控制
awk流程控制关键字: brak continue next #跳过当前行,读入下一行开始处理 exit #结束文本读入,转入执行END{}
- if
awk -F ':' ' BEGIN{i=0;j=0} { if($3<10){ i++ }else if($3>100){ j++ } } END{print i,j} ' passwd
- while
awk -F ':' ' BEGIN{sum=0} { i=1 while(i<NF){ if($i ~ /root/){ sum++ } i++ } } END{print sum} ' passwd
- for
awk -F ':' ' BEGIN{sum=0} { for(i=1;i<NF;i++){ if($i ~ /root/){ sum++ } } } END{print sum} ' passwd
- if
- awk数组
- 定义、使用
awk 'BEGIN{a[0]=1;a[1]=2;print a[0],a[1]}' awk 'BEGIN{a["ss"]=1;a["tt"]=2;print a["ss"],a["tt"]}' awk 'BEGIN{a[0]=1;a[1]=2;for(i in a){print a[i]}}' awk 'BEGIN{a["ss"]=1;a["tt"]=2;for(i in a){print a[i]}}'
- 用法
awk '!a[$0]++' passwd #去掉重复的行 awk -F ':' '{a[$7]++}END{for(i in a){print i,a[i]}}' passwd | sort -nr -k2 #统计字段出现的次数,并按次数倒序
- 定义、使用
sed
- sed格式:
sed [选项] '编辑指令' file sed -n '1,7p' passwd
- sed命令选项
-n #屏蔽默认输出 -i #直接修改文件内容 -f #使用sed脚本 -e #可指定多个处理动作 -r #启用扩展的正则表达式,放到第一个选项 -{} #可组合多个命令,以逗号分隔
- 定址符
- 正则表达式
sed -n '/nologin/p' passwd
- 行号
sed -n '1,4p' passwd
- 正则表达式
- 基本动作
p 打印
sed -n '4,+10p' passwd #输出第4行和其后10行 sed -n 'p;n' passwd #输出奇数行 sed -n 'n;p' passwd #输出偶数行 sed -n '$=' passwd #输出文件行数 sed -n '10,${n;p}' passwd #输出10行后的所有偶数行 sed -n '4p;7p' passwd #输出第4行和第10行
d 删除
sed '4,5d' passwd sed '4,5!d' passwd #保留4~5行 sed '$d' passwd #删除最后一行 sed '/^$/d' passwd #删除所有空行 sed '/^$/{n;/^$/d}' passwd #长处重复空行
s 替换(分割符:/ 或 # 或 &)
sed '/nologin/s/g/#####/' passwd #替换第1个 sed '/nologin/s/g/#####/5' passwd #替换第5个 sed '/nologin/s/g/#####/g' passwd #全部替换 sed '/nologin/s#g#?????????#g' passwd #全部替换(替换) sed '/nologin/s/&#####/g' passwd #把所有的's'替换为's#####' sed '/nologin/s//g' passwd #把所有的's'删除 sed 's/^/#/g' passwd #把所有行开头添加'#'' sed 's/^#//g' passwd #把所有行开头的'#'去掉 sed 's/nologin/&XXXXXXXXXXX/g' passwd #把所有的nologin替换为'nologinXXXXXXXXXXX'
i 行前插入
sed '2iHELLO WORLD' passwd #在第2行前插入HELLO WORLD
a 行后插入
sed '4,7aHELLO WORLD' passwd #在第4~7行后插入HELLO WORLD
c 替换当前行
sed '5cHELLO WORLD' passwd #把第5行替换为HELLO WORLD
r 读入文件并插入到指定行后
sed '1r/etc/sysconfig/network' passwd
w 把指定的行写入文件
sed -n '5,7w./xxx' passwd
h/H;g/G 复制粘贴(小写为覆盖,大写为粘贴)
sed '1h;2,3H;$G' passwd #把5~7复制到文件结尾