shell学习笔记
linux下查看cpu的个数及核数
查看物理cpu个数
grep 'physical id' /proc/cpuinfo
查看核⼼数量
grep 'core id' /proc/cpuinfo
在某些情况下,很多指令我想要⼀次输⼊去执⾏,⽽不想要分次去执⾏时,就要⽤到 && || 了。cmd 1 && cmd2
1,若cmd1执⾏完毕之后且正确($?=0),则开始执⾏cmd2。
2,若cmd1执⾏完毕之后且执⾏($? not equal 0),则cmd2不执⾏。
cmd1 || cmd2
1,若cmd1执⾏完毕之后且正确,则不执⾏cmd2.
2,若cmd1执⾏完毕之后错误,则执⾏cmd2
创建变量
a=1 注意:等号两边不能加空格
a=hello
a="hello world" 字符串中间有空格时,需要⽤双引号或单引号引⽤内容
a='hello world'
b="zhangsan"
a="hello $b" 双引号⽀持转义,$b会被当做变量,⽽不是字符串
shell中引⽤未定义的变量,不会报错,但也什么都不会发⽣
做变量和字符拼接时,需使⽤${a}包含变量
a=1111
echo ${a}_bbbb // 1111_bbbb
预定义变量(linux系统定义的变量)
$PWD
$USER
$HOME
$PATH
数组变量
ary=(1 2 3 4) //数组变量⽤()包含,中间⽤空格分开
ary=('aa' 'bb' ''cc)
echo $ary //获取数组的第⼀个元素
echo ${ary[@]} //获取数组所有的元素
echo ${ary[*]} //获取数组所有的元素
echo ${#ary[@]} //获取数组的长度
linux下的sleep函数echo ${#ary[*]} //获取数组的长度
echo ${ary[0]} //获取下标为0的元素,shell中数组下表从0开始
定义⼀个linux命令的变量,需⽤反引``号引⽤
a=`pwd`
echo $a //打印当前所在的路径
ary=(`ls`) //相当于吧ls命令执⾏后的内容放到这个数组中
echo ${ary[@]} //打印当前路径下的所有⽂件及⽂件下
shell中对变量进⾏算数操作
a=5;b=4
echo $((a+b)) //9
echo $((a+1)) //6
((a=a+5)) //将a+5后的值赋值给a
echo $a //10
((a++)); echo $a; //6 数据的⾃加或⾃减
shell中数据⽐较的使⽤
((a<b))
echo $? //?⽤于判断上⼀条语句的判断结果,为true返回0,
否则返回⾮0
数据类型
a="aaa"
b=123
c=true d=false
整数和浮点数
echo $((2/3)) //0
awk 'BEGIN{print 2/3}' //0.66667,返回浮点数
字符串的操作
a="hello from testerhome"
echo ${a:6} //from testerhome;字符串的截取,从第6位开始截取
echo ${a:6:4} //从第6位开始截取,截取4位
echo ${#a} //打印字符串的长度
echo ${a#hello} //对字符串从头开始掐,掐掉hello
echo ${a#*o} //从字符串头开始掐,到第⼀个o之前的字符全部掐掉,包括字符o echo ${a##*o} //贪婪匹配,匹配到最后⼀个o之前的字符全部掐掉,包括字符o echo ${a%home} //去尾
echo ${a%h*} //去尾第⼀个匹配到的字符h,字符h之后的全部去掉,包括h
echo ${a%%h*} //去尾的贪婪匹配
echo ${a/hello/xxx} //将字符穿中hello替换成xxx
判断运算
算术判断
[ 2 -eq 2 ]; //判断2是否等于2(中括号和数字之间必须要有空格)
[ 2 -ne 2 ] //不等于判断
[ 2 -gt 2 ] //⼤于判断
[ 2 -ge 2 ] //⼤于等于判断
[ 2 -lt 2 ] //⼩于判断
[ 2 -le 2 ] //⼩于等于判断
也可以⽤算术⽐较((10>=8))
[ 2 -eq 2 -a 3 -ne 4] //判断2等于2并且3不等于4的表达式结果
[ 2 -eq 2 -o 3 -ne 4] //判断2等于2或3不等于4的表达式结果
[ ! 2 -ge 1] //判断2等于1取反后的表达式结果
逻辑与和逻辑或都有短路情况
[ -e 1.sh ];echo $?  //判断单签路径下是否存在⽂件1.sh
if判断
if [ condition ]; then .....;elif then ....;else .. (i)
for循环
for循环遍历形式
arr=(1 5 6 8 9)
for i in ${arr[@]}; do echo $i; done
while循环
使⽤read按⾏读取⽂件内容
退出循环控制
break;
jobs 查看后台运⾏进程的信息
sleep 50 执⾏当前程序
crtl + z 键将当前程序调⾄后台且暂停运⾏
bg  1 后台执⾏对应程序
fg 1  将后台程序调⾄当前执⾏程序
/
bin/sh -n 1.sh  检查1.sh是否存在语法错误
/bin/sh -v 1.sh  执⾏依据打印⼀句
/bin/sh -x 1.sh
find  .  -name "*"  -mmin +10  查看系统当前路径下10分钟前被修改的⽂件
find  .  -name "*"  -mmin -10  查看系统当前路径下10分钟内被修改的⽂件
find . -name  "*" -mtime +10 查看当前路径下10天前被修改的⽂件
find . -type d -exec  echo {} \;  吧find查出来的⽂件交给后⾯的命令处理,{}代表find的结果集
xargs⽤法
find . -type f | xargs -i cp {} ./AAAA/    查当前路径下的⽂件,然后拷贝到AAAA⽂件夹下
查grep
grep -i “hello”    不区分⼤⼩写的匹配,且是模糊匹配
grep -o  "hello"  精确匹配
grep -o "c."  //表⽰匹配c后任意⼀位字符,如:ca,cb等
grep -o "c.*"  //*表⽰匹配任意多个字符
grep -o "[0-9]*"  // 匹配数字的正则
练习:读⼀个⽂件,然后循环请求⽂件中的内容,在查结果
练习:查⼀个⽹页中是否有死链接
awk  指定字符串按指定格式切
echo  "123|456|789"  | awk -F "|" '{print $1}'  $0 表⽰全部字符,$1表⽰切出来的第⼀个字符  FS:输⼊字符分隔符,默认为空格字符
OFS:输出字段分隔符,默认为空格字符
RS:⾏分隔符,默认按"回车换⾏"进⾏分割为⼀⾏记录
ORS:输出分隔符,默认按"回车换⾏"
NF:⾏的字段个数
NR:⾏号(从1开始)
FNR:处理多个⽂件时,各个⽂件分别计数的⾏号
FILENAME:当前⽂件名
ARGC:命令⾏参数的个数
ARGV:数组,保存命令⾏所给定的参数
练习:使⽤NR和NF
练习2:FNR分别对每个⽂件的⾏号计数
练习:RS⾏分隔符,让awk遇到空格就分割为新的⼀⾏(第四⾏def 和123是由于我们以空格为换⾏后,原本的回车换⾏就被当做是⼀⾏记录的原因)
练习:ORS输出分隔符,我们让awk以“---”为输出换⾏符
练习:ARGV表⽰⼀个数组,保存的是命令⾏所给定的参数
练习:ARGC表⽰参数的个数(参数个位3,是由于awk本⾝就是⼀个参数)
练习:awk中⾃定义变量
⽅式⼀:在awk中创建变量
⽅式⼆:调⽤外部的shell变量
awk 分割后判断某个字段是否满⾜条件
echo "1+2+5+4" | awk -F '+' '$3~/3/{print $1}'    //判断分割后的第三个字段是否是3,如果是3就打印$1
awk 循环统计⽂件中的所有记录数
  awk '{count++;print $0;} END{print "user count is ",count}' /etc/passwd  //循环打印每⾏记录且统计总数
cat /etc/passwd | awk 'BEGIN{count=0}{count+=1;print $0}END{print count}'  //循环打印每⾏记录且统计总数
awk 中使⽤关系运算符
cat /etc/passwd | awk -F ':' '{if(NR>=20 && NR<=30) print NR}'
awk中使⽤算术运算符
awk 'BEGIN{a=11;b=12;print a++,b++}'
awk 中使⽤三⽬运算符
awk 'BEGIN{a=1;b=2;print a==b?"ok":"err"}'
sed常见命令参数
  p==print
  d:delete
  = 打印匹配⾏的⾏号
  -n  取消默认的完整输出,只打印需要的⾏
  -e  允许多项编辑
  -i  修改⽂件内容
-r  不需要转义
sed  ⽂本替换
echo "cat dog fish cat" | sed ‘s/cat/wulala/’  //将第⼀个cat替换成wulala
 echo "cat dog fish cat" | sed ‘s/cat/wulala/g’  //将所有的cat替换成wulala
sed 替换⽂件中的内容
sed -i 's/hello/HELLO/'    // 加上-i 参数会替换掉⽂件中的内容
sed -i.bak  's/hello/HELLO/'    // ⽣成⼀个源⽂件的备份⽂件
sed -n ‘2p’    //只打印第2⾏的内容
sed -n '$p'    //打印最后⼀⾏
sed -n '/80462343/p'      //只打印包含80462343的⾏
cat /etc/passwd | sed -n '3,9p'  //打印3-9⾏的内容
sed  ‘2p’  //打印第2⾏的内容
sed '2d'      //删除第2⾏的内容不展⽰
sed '$d'      //删除最后⼀⾏
sed  '1a drink tea'    //在第⼀⾏后增加字符串drink tea
sed  '1,3a drink tea'    //在第1⾏到第三⾏的每⾏后⾯增加字符串drink tea
sed '1a drink tea \nor coffee' ab  #第⼀⾏后增加多⾏,使⽤换⾏符\n
sed  '1c xxxxx'     //将第⼀⾏替代为xxxxx
sed  '1,3c  xxxxx'    // 将第⼀⾏到第三⾏的内容替换为⼀⾏xxxxx(实际减少了两⾏)
sed  '/^a/c  xxxxx'      //替换以a开头的⾏,替换为xxxxx
sed '2,$s/a/A/g'     //替换第2⾏到最后⼀⾏中的a为A
sed '/^[0-9]/s/aa/AA/g'   //对所有以数字开头的⾏,进⾏替换操作
sed -i '$a bye'       //在⽂件ab中最后⼀⾏直接输⼊"bye"
sed 'li hello world'    //在⼀⾏前加上hello  world字符
sed '/a/d'      //删除所有包含字符a的⾏
seq 10 20 |sed 's/1/xxxx/g'      ///sed匹配正则表达式,将全部的1替换为xxxx
seq 10 20 |sed -n '/14/,/18/p'  // sed获取⼀个区间的⾏(获取数值为14-18区间的⾏)
sed 使⽤\1 \2等匹配指定的字段(使⽤seq 126 135 | sed -E 's/.(.)(.)/\1+\2/g' 匹配第⼀个和第⼆个字段)
⽂件参数
${*:1:3}  //取第1-3个参数
${*:$#}    //取最后⼀个参数
函数
case  语句的⽤法
  case  $key in
    1)
      echo "xxx1";
;;  //双分号表⽰改⾏选择命令的结束

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。