Linux shell常用命令

51 篇文章 0 订阅
Linux shell常用命令
★ 查看目录剩余空间
查看当前目录所在分区的使用情况:
[root@deploy wars]# df ./ -l
Filesystem              1K-blocks     Used Available Use% Mounted on
/dev/mapper/centos-root  96102556 41271160  54831396  43% /
查看当前目录所在分区的剩余空间:
[root@deploy wars]# df ./ -l | awk {'if (NR==2) print $0'}
/dev/mapper/centos-root  96102556 41271160  54831396  43% /
仅显示剩余空间:
[root@deploy wars]# df ./ -l | awk {'if (NR==2) print $4'}
54831396
[root@deploy wars]# df ./ -hl | awk {'if (NR==2) print $4'}
53G
查看指定目录剩余空间:
[root@deploy wars]# df /home/ -lh
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   92G   40G   53G  43% /
[root@deploy wars]# df /boot/ -lh
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       497M  126M  372M  26% /boot
★ 查看目录占用空间
[root@deploy local]# du -sh
197M    .
★ 查看子文件夹占用空间
[root@deploy local]# du -hd 1
197M    ./yum
197M    .
★ 查看所有子文件夹占用空间详细情况
[root@deploy local]# du -h
196M    ./yum/rpms
552K    ./yum/repodata
197M    ./yum
197M    .
★ 查看文件test.txt中的第2行
方法1:
[root@deploy wars]# grep -n '^' test.txt |grep  '^2:'|grep -o '[^2:].*'
/dev/mapper/centos-root  96102556 41271160  54831396  43% /
方法2:
[root@deploy wars]# sed -n '2p' test.txt
/dev/mapper/centos-root  96102556 41271160  54831396  43% /
方法3:
[root@deploy wars]# awk '{if (NR==2) print $0}' test.txt
/dev/mapper/centos-root  96102556 41271160  54831396  43% /
方法4:
[root@deploy wars]# tac test.txt | tail -2 | tac | tail -1
/dev/mapper/centos-root  96102556 41271160  54831396  43% /
★ 正则表达式
os=`uname -r`
os_check_reg=".*el7.*"
if [[ ! "$os" =~ $os_check_reg ]]; then
echo "no support"
exit 1
fi
★ if逻辑判断
[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[ ] || [ ] 用OR来合并两个条件
[ ] && [ ] 用AND来合并两个条件
eg: if [[ $a != 1 || $b = 2 ]]
if组合判断的多种判断方式样例:
#!/bin/sh
free_cur_dir=`df ./ -l | awk '{if (NR==2) print $4}'`
free_root_dir=`df / -l | awk '{if (NR==2) print $4}'`
free_min=15000000
echo $free_cur_dir
echo $free_root_dir
echo $free_min
#方法1:if [[ "$free_cur_dir" -lt $free_min || "$free_root_dir" -lt $free_min ]]; then
#方法2:if [[ "$free_cur_dir" -lt $free_min ]] || [[ "$free_root_dir" -lt $free_min ]]; then
#方法3:if [[ "$free_cur_dir" < $free_min ]] || [[ "$free_root_dir" < $free_min ]]; then
#方法4:if [ "$free_cur_dir" -lt $free_min -o "$free_root_dir" -lt $free_min ]; then
#方法5:
if ((free_cur_dir < free_min)) || ((free_root_dir < free_min)); then
echo "space not enouth"
else
echo "space ok"
fi
★ grep查找时指定文件扩展名
grep --include="*.sh" "cp " ./ -r
du
打印目录下的文件夹大小并排序
# du -m |sed 's/\-/\ /' |awk '{printf "%+12s   %-10s\n",$1,$2}' |sort -n
           0   ./rh      
           1   ./type_test
           1   ./ftp_down
          17   .        

# du -m |tr '-' ' ' |awk '{printf "%+12s   %-10s\n",$1,$2}' |sort -n
           0   ./rh      
           1   ./type_test
           1   ./ftp_down
          17   .         
循环每秒打印一次当前目录大小(MB),打印时包含时间信息:
# while true; do du -sm --time --time-style=full-iso ; sleep 1; done  
387250  2019-11-16 05:52:51.348258934 +0000     .
387287  2019-11-16 05:52:52.372263940 +0000     .
387324  2019-11-16 05:52:53.376268848 +0000     .
......
更多du详细信息,可以参考man du


for循环
for i in 1 2 3; do echo "$i ---"; done
for i in `ls *.txt`; do echo $(ls -l $i);done
total=0; for (( i=1; i<=10; i++)); do total=$(( $total + $i )); done; echo $total; 

while循环
i=1; while(($i < 10)); do i=$(($i + 1)); echo $i; done
i=1; while(($i<10)); do i=$(($i+1)); echo $i; done  //表达式中间也可以没有空格
i=1; while(($i < 10)); do i=$(($i + 1)); echo $i; done
i=1 
while(($i<10)) 
do 
  i=$(($i+1)) 
  if(($i%2==0)) 
    then 
    echo "--2x: $i"
  fi
done 



计算器
expr 1 + 2
expr 1 \* 2                 
expr 3 / 2
echo $((3/2))
echo $[3/2]
上面这些仅支持整数的计算,结果也只精确到整数。
如果要使用浮点计算,可以参考下面方法:
使用python
[root@localhost ~]# python -c 'print 2 / 2'
1
[root@localhost ~]# python -c 'print 2 * 2.3'
4.6
[root@localhost ~]# python -c 'print 5 / 2.5' 
2.0
[root@localhost ~]# python -c 'print 4 / 2.5' 
1.6
利用bc高精度计算语言
[root@localhost ~]# echo "scale=3;1.8*1024*1024/(321164-318973)/60"|bc
14.357
其中scale=3表示精确到小数点后面3位
利用awk
[root@localhost ~]# awk 'BEGIN{a=3.14;b=5;print "a+b="a+b; print "b/2="b/a }'
a+b=8.14
b/2=1.59236
[root@localhost ~]# 
进制转换
# printf "0x%x\n" 16
0x10
#python
>>>
>>> int(0b11)
3
>>> int('11',2)
3
>>> int('f',16)
15
>>> int('17',8)
15
>>> 
awk & xargs
ls -1 |awk '{print "ls -l "$1}'
ls -1 |xargs -I {} echo ls -l {}
find *.rpm |xargs -I {} chmod u+x {}
awk 中使用 substr 截取字符串的子串(截取16位md5值):
[root@localhost home]#  md5sum a.txt  | awk '{print $1}'
5c9597f3c8245907ea71a89d9d39d08e
[root@localhost home]#  md5sum a.txt  | awk '{print substr($1,9,16)}'
c8245907ea71a89d
[root@localhost home]# 
awk中的print转大小写处理:
使用 toupper 和 tolower 函数:
[root@localhost home]#  md5sum a.txt  | awk '{print toupper($1)}'
5C9597F3C8245907EA71A89D9D39D08E
[root@localhost home]#  md5sum a.txt  | awk '{print tolower($1)}'
5c9597f3c8245907ea71a89d9d39d08e
 


expr
# expr length "abc" 
3
# expr 3 / 2
1
# expr 3 \* 2
6
# expr substr "hello test" 1 2
he
# expr index "hello test" h
1
# expr index "hello test" e

# expr index "hello test" l

# expr index "hello test" hello

# expr index "hello test" test
2
# i=5; expr $i + 1
6
★ 查看服务器上所有的每个IP有多少个连接数
# netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
      1 10.100.51.110
      1 192.168.1.172
      1 Address
      1 servers)
      2 10.100.1.90
     38 127.0.0.1
如果怀疑遭受到DDOS攻击,可以用该目录查看连接数。如果每个IP有成成百乃至上千个连接数,就不太正常了。

Linux shell 中的几种括号的用法:

( )    
用途1:在运算中,先计算小括号里面的内容
用途2:数组
用途3:匹配分组


(( ))    
用途1:表达式,不支持-eq 这类的运算符。不支持-a 和-o,支持<=、>=、<、>这类 比较符和&&、||
用途2:C 语言风格的 for(())表达式

$( )
执行 Shell 命令,与反撇号等效,即与 `` 效果相同。例如:a=$(echo "test"); echo $a 和 a=`echo "test"`; echo $a; 效果相同都输出a的值test


$(( ))         
用途1:简单算数运算
用途2:支持三目运算符 $(( 表达式?数字:数字 )) 


[ ]
条件表达式,里面不支持逻辑判断符

[[ ]]
条件表达式,里面不支持-a 和-o,不支持<=和>=比较符,支持-eq、<、>这类比较 符。支持=~模式匹配,也可以不用双引号也不会影响原意,比[]更加通用 


$[ ]
简单算数运算 


{ }
对逗号 , 和点点 .. 起作用。例如:
touch {a,b}  创建 a和b 两个文件
touch {a..c} 创建 a,b,c 三个文件
touch {1,2}  创建 1和2 两个文件
touch {1..10}  创建 1,2,3,4,5,6,7,8,9,10 10个文件
for i in {1..10}; do echo $i; done  循环10次

${ }    
用途1:引用变量。例如:a=100; echo ${a} 输出100,等同于 echo $a; 但 $a 和 ${a} 也有区别,例如:a=100; $a表示100,$a23,则不存在;而 ${a} 表示100,${a}23,则表示10023
用途2:字符串处理 


Linux 中的常见变量:

a=100 普通设置变量的方式、无需提前申请,可以直接设置后使用变量。使用变量方式为:
$a
${a}

$$ :shell自身的PID
$! :shell最后运行的后台PID
$0 :shell自身脚本的文件名
$1~$n :shell脚本的各个入参值,$1 表示第一个参数,$2表示第二个
$# :shell脚本传入的入参的总个数(入参数量)
$? :上一条命令返回的结束代码(0表示正常,其他表示异常)
$* :shell脚本的所有参数的列表,若$*用""括起来,即"$*"表示以"$1 $2 ... $n"形式输出所有参数
$@ :shell脚本的所有参数的列表,若$@用""括起来,即"$@"表示以"$1" "$2" ... "$n"形式输出所有参数
     $* 和 $@ :没用用引号包含起来时是一样的,都为"$1 $2 ... $n"形式输出
$() 等同于反引号``,运行一段命令
$(()) 进行数字运算,如echo $((a+b+c))


Linux shell 三目运算

[root@localhost home]# a=100; b=200; ((ret=a>b?1:0)); echo $ret; 
0
[root@localhost home]# a=100; b=200; ((ret=a<b?1:0)); echo $ret; 
1

[root@localhost home]# a=100; b=200; ((ret=$a>$b?1:0)); echo $ret;
0
[root@localhost home]# a=100; b=200; ((ret=$a<$b?1:0)); echo $ret; 
1

[root@localhost home]# a=$((100<200?1:0)); echo $a    
1
[root@localhost home]# 
[root@localhost home]# a=$((100>200?1:0)); echo $a  
0

只能用于数字,不能用于字符串,不支持下面这种写法:a=100; b=200; ((ret=a<b?"lt":"gt")); echo $ret;

关于:>/dev/null 2>&1 

Linux上执行命令时经常会用到 >/dev/null 2>&1 ,例如:

标准输出stdout的信息重定向追加输出到日志文件 demo.log 中,错误输出stderr的信息等等同:
nohup java -jar demo.jar --spring.config.location=./application.yml >>demo.log 2>&1 &

标准输出stdout的信息重定向追加输出到空设备文件(丢弃),错误输出stderr的信息等等同:
nohup java -jar demo.jar --spring.config.location=./application.yml >/dev/null 2>&1 &

说明:
> :代表重定向到哪里。
/dev/null :代表空设备文件。
2> :代表标准错误stderr。
& :代表等同于1。2>&1 意思是2的输出重定向等同于1。
1 :代表标准输出stdout。
& :最后一个&代表后台运行。

>/dev/null 2>&1  也可以写成  1>/dev/null 2>&1
 

Linux shell中的函数定义、传参和调用:

参考:Linux shell中的函数定义、传参和调用-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值