shell

字符串操作

取值

${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 匹配的字段
原文地址:https://www.cnblogs.com/jaigejiayou/p/13385767.html