字符串操作
取值
${value:offset} ${value:offset:length}从变量中提取字串
${#value}字符串长度
${#array[*]},${#array[@]}数组中元素的个数
掐头去尾与内容替换
${value#pattern} ${value##pattern} #掐头,掐掉*前的,*在pattern前
${value%pattern} ${value%%pattern} %去尾,去掉*后的,*在pattern后
${value/pattern/string} ${value//pattern/string} /替换
#与##,%与%%,/与//区别:最短匹配模式VS最长匹配模式
echo $c|sed 's#c#4#g' g全局匹配,+g :匹配每一行有行首到行尾的所有字符;不加g:匹配每一行的行首开始匹配,匹配到第一个符合的字段,就会结束,跳到下一行
打印序列seq
seq 10=>1,2,3,4,5,6,7,8,9,10
seq 10 20=>10,11,12,13,…20
seq 10 3 20=>10,13,16,19
[root@hadoop101 ~]# c="hello testerhome w456" [root@hadoop101 ~]# echo ${#c} 21 [root@hadoop101 ~]# echo ${c:2:3} llo [root@hadoop101 ~]# echo ${c/o/0} hell0 testerhome w456 [root@hadoop101 ~]# echo ${c//o/0} hell0 testerh0me w456 [root@hadoop101 ~]# echo ${c#*t} esterhome w456 [root@hadoop101 ~]# echo ${c%e*} hello testerhom [root@hadoop101 ~]# echo ${c%%e*} h [root@hadoop101 ~]# echo ${c##*t} erhome w456 [root@hadoop101 ~]# echo $c|awk '{print substr($0,2,3)}' ell [root@hadoop101 ~]# echo $c|sed 's#4#c#g' hello testerhome wc56 [root@hadoop101 ~]# echo $c|sed 's#e#c#' hcllo testerhome w456 [root@hadoop101 ~]# echo $c|sed 's#e#c#g' hcllo tcstcrhomc w456
判断
算术判断
[ 2 -eq 2 ],括号两边必须有空格,(())也可表示算术运算((10>=8))
-eq 等于 -ne不等于
-gt 大于 -ge大于等于
-lt 小于 -le小于等于
字符串比较
[ str1=str2 ] 相等为真,注意不是==
[ str1!=str2 ] 不等为真
[ -n "$var" ] 如果字符串不为空,结果为真
[-z "$var" ] 如果字符串为空,结果为真
[[ "xxx"===x* ]] 在表达式中表示0或者多个字符
[[ xxx==x?? ]] 在表达式中表示单个字符
逻辑运算
[ 2 -ge 1 -a 3 -ge 4 ] , [[ 2 -ge 1 && 3 -ge 4 ]] 与
[ 2 -ge 1 -o 3 -ge 4 ] , [[ 2 -ge 1 || 3 -ge 4 ]] 或
[ !2 -ge 1 ]非
逻辑控制
if
if[ condition ];then ...;fi
if[ condition ];then ...;else ...;fi
if[ condition ];then ...;elif ...;fi
for
for [condition];do ...;done
for((i=0;i<10;i++));do echo $i;done
for i in $array[*];do echo $i;done
while
i=0;while [ $i -lt 3 ];do echo $i;((i=i+1));done
一行行的读取文件
while read line;do echo $line;done </tmp/tmp
函数
ff(){ for d in $@ "$@" $* "$*";do echo $d;done; };
函数调用,传参
ff 1 2 '3 "4 5" 6'7 "8 9"
grep,awk,sed
grep数据查找定位
awk数据切片
sed数据修改
grep
grep pattern file grep -i pattern file 忽略大小写 grep -v pattern file不显示匹配的行 grep -o pattern file 把每个匹配的内容用独立的行显示 grep -E pattern file使用扩展正则表达式 grep -A -B -C pattern file打印命中数据的上下文 grep pattern -r dir/ 递归搜索 ##pattern正则表达式
awk
awk 'pattern{action}' awk 'BEGIN{}END{}' 开始和结束 awk '/Running/' 正则匹配 awk '/aa/,/bb/' 区间匹配 awk '$2~/xxx/' 字段匹配($2,表示匹配第二个字段) awk 'NR==2' 取第二行 awk 'NR>1' 去掉第一行 awk内置变量 FS字段分隔符 OFS输出数据的字段分隔符 RS记录fengef ORS输出数据的记录分隔符 NF字段数 NR行数 awk字段数据处理 -F 指定字段分隔符 BEGIN{FS="_"} 指定"_"为分隔符 $0表示原来的行,$1~$N代表第几个字段,$NF最后一个字段
sed
sed[addr]X[options] -e 表达式 sed -n '2p' 打印第二行,n表示行,p表示print,通常一起使用 sed 's#hello#world#' 修改,将hello改为world -i 直接修改源文件
#通常用sed -i '.bak' 备份修改 -E 扩展表达式 --debug调试 20 20,35行数与行数范围 /pattern/ 正则匹配 //,//正则匹配的区区间 d删除 s/REGEXP/REPLACEMENT/[FLAGS] 12 匹配的字段