常用的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行;
上图就是线程的具体执行情况截图