【Shell】万字总结建议收藏|2021面试与工作中最常用的Shell语法命令汇总

常用的Shell命令与语法大全

将持续更新!!!!

自定义变量

等号两边不能有空格;

变量的类型都是字符串,无法直接数值计算;

如果变量有空格,用单引号或双引用引用;

设置变量:

A=10

取消变量:

unset A

声明静态变量:

readonly #不能unset

定义数组

arr=(0,1,2)
特殊变量

$n n为数字,$0是脚本名称,$1-$9代表第一个~第九个参数值,10个以上的需要用大括号括起来,如 ${10}

$# 获取参数个数

$@ 也是获取参数个数

$? 最后命令的返回状态,正确为0,不正确!0

运算符

$((运算式)) 或者 $[运算式]

expr空格 +,-,、\*,/,% 运算符左右两侧有空格

#计算(2+3)*4
expr `expr 2 + 3` \* 4
$[(2+3)*4]
读取输入流
read -n number_of_chars variable_name

例如:

#读取输入流
[root@VM_0_17_centos ~]# read -n 2 var
dl[root@VM_0_17_centos ~]# echo $var
dl
# 无回显读取
[root@VM_0_17_centos ~]# read -s var
[root@VM_0_17_centos ~]# echo $var
skd
# 显示提示信息
[root@VM_0_17_centos ~]# read -p "Enter:" var
Enter:hehehe
[root@VM_0_17_centos ~]# $var
-bash: hehehe: command not found
[root@VM_0_17_centos ~]# echo $var
hehehe

:命令 while :; 总是会返回为0的退出码,;可替代while true;速度快,不用创建进程;

暂停等待:

sleep命令 sleep 30 表示30秒后执行

分割字符串:

使用$IFS

line=$PATH
oldIFS=$IFS
for item in $line
do
	echo $item
done
IFS=$oldIFS
if与循环

for循环

#C语言版
#!/bin/bash
for((i=0;i<10;i++))
{
    echo $i
}
# 基本格式
#!/bin/bash
for item in {a..z}
do
    echo $item
done

while循环

#!/bin/bash
while :
do
    echo $(date)
    sleep 1
done

if条件

if condition;
then
	commands;
else if condition; then
	commands;
else
	commands;
fi

数值文件比较符号

变量数值比较符号

-eq: 等于
-ne: 非
-----------------------------
-gt: 大于
-lt: 小于
-ge: 大于或等于
-le:小于或等于
-----------------------------
-a: 逻辑与
-o: 逻辑或

文件系统比较符号

[ -f $文件名 ]: 如果文件名/文件路径存在则为真
[ -x $文件名 ]: 如果文件可执行则为真
[ -d $文件名 ]: 如果是目录则为真
-e: 如果文件存在则为真
-w: 文件可写则为真
-r: 文件可读则为真
-L: 是个链接符号则为真

字符串比较

[[ $str1 = $str2 ]]: 当str1和str2包含文本是一模一样的,返回true
[[ $str1 != $str2 ]]: 当两个字符串不等时返回true
[[ -z $str ]]: 如果字符串是空字符串,则为true
[[ -n $str ]]: 如果字符串是非空字符串,则为true

常见的命令脚本
正则表达式

在这里插入图片描述

列出当前路径下的目录
ls -d */
ls -F | grep "/$"
ls -l | grep "^d"
find . type -d -maxdepth 1

匹配上的行数
# 前提
ps aux | grep 'java -jar'
root      8465  0.0 16.2 2557740 305652 ?      Sl   May24  68:41 java -jar wx_bill-1.0.jar
root     11203  0.0 19.6 2614092 370332 ?      Sl   May20  81:54 java -jar news-all-1.0-SNAPSHOT.jar
root     19492  0.0  0.0 112712   968 pts/1    R+   21:16   0:00 grep --color=auto java -jar
#############################
ps aux | grep -c 'java -jar'
3

只查看第3行内容
# 前提
ps aux | grep 'java -jar'
root      8465  0.0 16.2 2557740 305652 ?      Sl   May24  68:41 java -jar wx_bill-1.0.jar
root     11203  0.0 19.6 2614092 370332 ?      Sl   May20  81:54 java -jar news-all-1.0-SNAPSHOT.jar
root     19492  0.0  0.0 112712   968 pts/1    R+   21:16   0:00 grep --color=auto java -jar
######################################
ps aux | grep 'java -jar'| sed -n '3p'
root     20681  0.0  0.0 112712   964 pts/1    R+   21:22   0:00 grep --color=auto java -jar

$() $(()) $[] ${}

$() 与`` 都是做命令替换用的

用 作 变 量 替 换 的 , {}用作变量替换的, {var}和$var一样

$[[]] $(()) 用来运算的

文本文件的交集与差集

comm

首先比较的文本需要经过排序sort a.txt -o a.txt

 -1 从输出中删除第一列;

 -2 从输出中删除第二列;

 -3 从输出中删除第三列。

打印文件比较结果
comm a.txt b.txt
第一列是A出现的行
第二列是B出现的行
第三列是AB相同的行

交集
comm a.txt b.txt -1 -2

打印不同
comm a.txt b.txt -3

a的差集
comm a.txt b.txt -2 -3

b的差集
comm a.txt b.txt -1 -3

查看系统相关命令(jvm调优)

查看系统运行状态的命令

top命令

在这里插入图片描述

load average: 分别记录了一分钟、五分钟、以及十五分钟的系统平均负载 ;当三个加起来/3>0.7,则当前服务器压力较大;

uptime命令

在这里插入图片描述

精简版的top命令;

vmstat命令

vmstat -n 2 3:每两秒采样,共采样3次;

在这里插入图片描述

procs:

  • r: 运行和等待CPU时间片的进程数,原则上1核CPU的运行队列不超过2,整个系统的运行队列不能超过总核数的2倍;
  • b:等待资源的进程数(阻塞的进程数);

cpu:

  • us:用户进程消耗CPU时间百分比,us值高,用户进程消耗CPU时间多,如果长期大于50%,需要优化程序;
  • sy:内核进程消耗CPU的时间百分比;
  • (us+sy)参考值为80%,如果>80%说明CPU可能不足;
  • id:处于空闲的CPU百分比;
  • wa:系统等待IO的CPU时间百分比;
  • st:来自于一个虚拟机偷取的CPU时间的百分比;
mpstat命令

mpstat -P ALL 2 每两秒打印一次CPU使用情况;

在这里插入图片描述

CPU:表示当前机子所有的CPU(图中是4个,0, 1, 2, 3);其中idle空闲率越高越好,表示机子越空闲,当低于60,则表示有压力了;

pidstat命令

pidstat -u 1 -p pid查询每个进程使用CPU的用量分解信息;

在这里插入图片描述

pid -p pid -r 采样间隔秒数查看进程的内存使用情况;

pid -d 采样间隔秒数 -p pid查看进程的磁盘I/O占用情况;

free命令

free -m 其中 -m:表示Mb; -g:表示Gb

在这里插入图片描述

应用程序可用内存/系统物理内存>70%表示内存充足;

应用程序可用内存/系统物理内存<20%表示内存不足,需要增加内存;

其余表示基本够用;

df命令

df -h 查看当前机器磁盘空间使用情况

在这里插入图片描述

iostat命令

若该命令不存在则需要安装 yum install -y sysstat 查看详情

iostat -xdk 2 3:查看磁盘IO情况;

在这里插入图片描述

rkB/s每秒读取数据量kb

wkB/s每写入数据量kb

上面两个值根据不同系统有不同的值,但长期,超大数据读写,肯定不正常,需要优化程序读取;

svctm I/O请求的平均服务时间,单位ms

await I/O请求的平均等待时间,单位ms,值越小性能越好;

上面两个值如果值较为接近,表示几乎没有I/O等待,磁盘性能好;如果await值远高于svctm ,表示I/O等待时间长,需要优化程序或更换磁盘;

util 1s种有百分之几的时间用于I/O操作。接近100%时,表示磁盘带宽跑满,需要优化程序或者增加磁盘;

pgrep命令
# 例如已运行java  -jar a.jar
# 根据应用名查询进程
pgrep -a java
# 根据参数查询进程
pgrep -lf a.jar

cat命令-查看

与stdin合并输出

echo "hhh" | cat - file.txt
# - 被作为stdin的文件名

压缩连续空行,多个空行只显示一个

cat -s file

显示行号

cat -n file

cut命令-切割

参数

-f: 列号 提取第几列
-d: 分隔符 按照指定分隔符分割

举例

############## example1 ###############
jps -l
5664 sun.tools.jps.Jps
8465 wx_bill-1.0.jar
14385 org.apache.catalina.startup.Bootstrap
11203 news-all-1.0-SNAPSHOT.jar
################################
# 筛选wx_bill....的进程号8465
jps -l | grep wx_b* | cut -d " " -f 1
#############结果如下############
8465
############## example2 ##############
pgrep -a java
8465 java -jar wx_bill-1.0.jar
11203 java -jar news-all-1.0-SNAPSHOT.jar
#################################
# 筛选第二例第三列到最后(就是第四列)(可写2,3,4 或 2-4, 或2-)
pgrep -a java | cut -d " " -f 2-4 
#############结果如下############
java -jar wx_bill-1.0.jar
java -jar news-all-1.0-SNAPSHOT.jar

sed命令

是一种流编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末。文件内容并没有改变,除非使用重定向。

sed [可选参数] "指令" 文件名

######## 参数 ########
-e # 直接再指令模式上进行sed的动作编辑 就是多指令使用
######## 指令 ########
a # 新增 a的后面可以接字符串,在下一行出现 na
d # 删除  /d
s # 查找并替换 s/  /g

举例

# 前提
ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.17  netmask 255.255.240.0  broadcast 172.17.15.255
        inet6 fe80::5054:ff:fe76:7609  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:76:76:09  txqueuelen 1000  (Ethernet)
        RX packets 595389705  bytes 337113538112 (313.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 413368953  bytes 68209882550 (63.5 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# 在第二行后增加一句插入成功
ifconfig eth0 | sed '2a 插入成功'
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.17  netmask 255.255.240.0  broadcast 172.17.15.255
插入成功
        inet6 fe80::5054:ff:fe76:7609  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:76:76:09  txqueuelen 1000  (Ethernet)
        RX packets 595390239  bytes 337113587523 (313.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 413369470  bytes 68209975127 (63.5 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# 删除含有X的行
ifconfig eth0 | sed '/X/d'
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.17  netmask 255.255.240.0  broadcast 172.17.15.255
        inet6 fe80::5054:ff:fe76:7609  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:76:76:09  txqueuelen 1000  (Ethernet)


# 将TX 替换成HELLO
ifconfig eth0 | sed "s/TX/HELLO/g"
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.17  netmask 255.255.240.0  broadcast 172.17.15.255
        inet6 fe80::5054:ff:fe76:7609  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:76:76:09  txqueuelen 1000  (Ethernet)
        RX packets 595392213  bytes 337113917121 (313.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        HELLO packets 413371255  bytes 68210282215 (63.5 GiB)
        HELLO errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# 将第二行删除 并将TX替换成HELLO
ifconfig eth0 | sed -e "2d" -e "s/TX/HELLO/g"
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::5054:ff:fe76:7609  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:76:76:09  txqueuelen 1000  (Ethernet)
        RX packets 595392913  bytes 337113979730 (313.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        HELLO packets 413371921  bytes 68210390742 (63.5 GiB)
        HELLO errors 0  dropped 0 overruns 0  carrier 0  collisions 0

find命令-文件查找

列出当前目录及其子目录下的所有文件和文件夹

find basePath

根据文件名搜索

find 路径 -name "搜索的名称"
find 路径 ! -name "搜索的名称" # 搜索相反的
find 路径 -iname "搜索的名称" # 忽略文件名大小写 
find 路径 \(-name "*.txt" -o -name "*.pdf")\ # 多个搜索条件
find 路径 -mindepth 1 -maxdepth 2 -name "搜索的名称" # 搜索目录最小深度1层 最大深度2层
find 路径 -regex ".*\(\.py\|\.sh\)$" #正则表达式搜索py或者sh文件

根据文件类型搜索

find . -type d # 列出所有目录
find . -type f # 只列出所有文件
find . -type l # 只列出符号链接

根据文件时间进行搜索

-atime 最近一次访问文件时间

-mtime 文件内容最后一次被修改的时间

-ctime 文件元数据(例如权限or所有权)最后一次改变的时间

find . -type f -atime -7 # 7天以内访问的所有文件
find . -type f -atime +7 # 超过7天访问的文件 -表示小于 +表示大于

查找后直接删除

find . -type f -name "*.swp" -delete

查询后执行

find . -type f -exec comand {} \ # {}会被替换成查到的文件 前后要有空格

[root@VM_0_17_centos shell_script]# find . -name "file1" -exec cat {} \;
Excuse me
yes
Is this your handbag
pardon
Is this your handbag
yes it Is
thank you very much

awk命令

基本用法

awk [可选参数] 'pattern1{action1} pattern2{action2}...' filename

pattern:表示AWK在数据中查找的呢容,就是匹配模式;

action:在找到匹配内容时所执行的一系列命令;

可选参数

-F 指定输入文件拆分符
-v 赋值一个用户定义变量

内置变量

FILENAME: 文件名

NR:已读的记录数

NF:浏览记录的域的个数,切割后,列个数

举例

# 准备数据
cat content 
#-----------------------------------------#
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
root:temp_x:5:temp_0:temp_root:temp_/root:temp_/bin/bash

# 搜索文件中以root关键字开头的所有行,并输出第1列,第7列
awk -F : '/^root/{print $1 "," $7}' content
root,/bin/bash
root,temp_/bin/bash

# 还是上面的结果,在上面开头一行加入文本"user, shell" 最后一行加入"test, the Test"
awk -F : 'BEGIN{print "user, shell"} /^root/{print $1 "," $7} END{print "test, the Test"}' content
user, shell
root,/bin/bash
root,temp_/bin/bash
test, the Test

# 将第三列的数值增加10
awk -F : -v i=10 '{print $3+i}' content
10
11
12
13
14
15

# 第三列求和
awk -F : '{sum += $3} END{print sum}' content 
15

# 打印内置变量
awk -F : '{print FILENAME "," NR "," NF}' content
content,1,7
content,2,7
content,3,7
content,4,7
content,5,7
content,6,7

sort命令

基本用法

sort(选项)(参数)

选项

-n 依据数值的大小排序
-r 以相反的顺序来排序
-t 设置排序时所用的分隔字符
-k 指定需要排序的列

参数:指定待排序的文件列表

去除重复行

sort filename | uniq

举例

# 准备文本
cat file
#-----------------------#
xiaoming,5
zhangsan,1
wangwu,2
lisi,4
zhaoliu,3

# 第二列升序排
sort -t , -nk 2 file 
zhangsan,1
wangwu,2
zhaoliu,3
lisi,4
xiaoming,5

# 第一列降序排
sort -t , -rk 1 file 
zhaoliu,3
zhangsan,1
xiaoming,5
wangwu,2
lisi,4

uniq命令

去除重复行

sort file |uniq

查找非重复行

sort file |uniq -u

查找重复行

sort file |uniq -d

统计

sort file | uniq -c

去除重复的行,并生成新的文件

sort file |uniq > new_file

dd命令

创建特定大小的文件

dd if=/dev/zero of=junk.data bs=1M count=1

if代表输入文件(input file), of代表输出文件(output file),bs代表以字节为单位的块大小(block size),count代表需要被 复制的块数

ps命令

ps -mp pid -o THREAD,tid,time:查看线程信息(这次是非进程了)

-m:显示所有的线程

-p:pid进程使用CPU时间

-o:该参数后是用户自定义格式

在这里插入图片描述

找出最占CPU的线程ID(TID),将线程ID转化成16进制英文小写后使用下列命令:

jstack 31353 | grep 7a7a -A60:7a7a是线程31354的16进制,31353是进程pid -A60是显示头60行;

在这里插入图片描述

上图就是线程的具体执行情况截图

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BugGuys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值