Linux常用命令与Shell语法总结
几点注意事项
-
字符串变量引用时最好加上"", 如 “$a”
-
一次执行多条命令,可以有如下三种方法, 其区别如下:
- 分号: 顺序地独立执行各条命令, 彼此之间不关心是否失败, 所有命令都会执行
- && : 顺序执行各条命令, 只有当前一个执行成功时候, 才执行后面的
- || : 顺序执行各条命令, 只有当前面一个执行失败的时候, 才执行后面的
-
设置shell脚本遇到错误时自动退出, 不执行后续命令
#!/bin/bash -e 或者 set -e
特殊文件
- /dev/null 重定向到此文件的数据都会被系统丢掉
- /dev/tty 自动重定向到一个终端
函数使用
# 函数定义
function funname() {action;retun;
}
# 函数使用
funname param1 param2
特殊符号
> 覆写原先的内容
>> 在原先的内容后追加
$? 前一个命令或者函数的返回码, 0表示执行成功
$1 表示第一个参数,$2 表示第二个
$# 命令行参数的个数
$0 当前程序的名称
$* 以"参数1 参数2 ..."的形式保存所有参数
$ 本程序进程PID
$! 上一个命令的PID
脚本内取得输入命令时的参数: $n n代表第几个参数
比较运算
一般用于在if条件中,用[]包裹,注意前后空格
数值比较
- -ne 不等于则为真
- -eq 等于则为真(用来判断数字)
- -gt 大于则为真
- -ge 大于等于为真
- -lt 小于为真
- -le 小于等于为真
字符串比较
- var1 = var2 判断两个字符串是否相等
- var1 != var2 判断两个字符串是否不相等
- -n “$var” 当字符串的长度大于零时为真(要用双引号包括—)
- -z “$var” 当字符串的长度等于零时为真(要用双引号包括—)
文件比较
- -d file 检查file是否存在并且是一个目录
- -f file 检查file是否存在并且是一个文件
- -e file 检查file是否存在
逻辑操作运算
- [ condition1 ] && [ condition2 ] 与
- [ condition1 ] || [ condition2 ] 或
控制语句语法
控制条件condition用[]包起来,或者使用test语句.注意空格
# if语句:
if [ condition ];thencommand
fi
# if-else:
if [ condition ];thencommand
elif [ condition2 ];thencommand
elsecommand
fi
# while语句:
while [ condition ];docommand
done
数学运算
推荐使用 $[] 这种格式
# 1.使用 $[],推荐使用(注意在引用变量的时候需要加$)
n1=4
n2=3
n3=$[$n1 * $n2] #输出12# 2.let用法,提供常用运算符,
注意: 变量前不需要加$运算符且let之后的表达式不要有空格
no1=4;
no2=5;
let result=no1+no2# 3.expr用法,只识别部分比较简单的运算符
result=`expr 3 + 4`
result=`$no1 + 4`# 3.注意,已上只能用于整数计算,下面这个也可用于浮点计算(使用bc命令)
# 输出2.24
echo "4 * 0.56" |bc
# 输出81.0
no=54
result=`echo "Sno * 1.5" |bc`
echo $result
文件读取
以每一行为单位依次读取文件
while read line; doecho $line
done < /home/db2inst1/temp1.txt
数组操作
# 定义数组(数组下标从0开始)
my_array=(A B "C" D)
# 定义一个空数组
my_array=()
# 读取数组
${my_array[index]}
# 给数组某一项赋值(注意此处不需要使用$)
my_array[0]=1
# 获取数组的长度
${#my_array[@]}
# 遍历数组(每一项为具体值)
for item in ${arr[@]}
doecho $item
done
# 遍历数组(每一项为数组下标)
for i ${!arr[@]}
doecho $i
done# 将某条命令执行的结果全赋值给数组
my_arr=(`awk '{print $2}' file.txt`)
for循环写法
# 循环10次
for i in $(seq 1 10)
doecho $i
done
正则表达式
正则表达式可用于sed, awk,grep等命令.
注意, sed只能使用基本正则表达式,不能使用扩展的正则表达式,sed在使用时需要使用//来包裹
基本正则表达式
# 1. 基础用法, 匹配含有word的行
grep 'word' file_name
# 2. ^word 匹配word在行首的行
grep '^word' file_name
# 3. word$ 匹配word在行尾的行
grep 'word$' file_name
# 4. . 匹配除换行符之外的任意一个字符(空格也是一个字符),该处必须有字符存在
# 匹配行中含有at的字符,且at前面有一个字符,如下面第一行,第三行可以匹配,第二行不能匹配,因为at在行首,前面无任何字符
#This is at dog
#at a dog
#th hs cat fd
sed -n '/.at/p' file_name # 5. * 匹配0个或任意多个前一个正则表达式字符
# 以下全部匹配
#i ha kg
#kkkkg
grep 'k*g' file_name# 6. [] 搜索集合字符, []括号内的^表示除[]内的字符之外的所有字符
grep '[0-9]' file_name # 匹配出现数字的行
grep '[abc]' file_name # 匹配出现a或者b或者c的行
grep '[a-z]' file_name # 匹配出现小写字母的行
grep '[A-Z]' file_name # 匹配出现大写字母的行
grep '[a-zA-Z0-9]' file_name # 匹配出现字母或数字的行
# 7. x\{\} 匹配字符连续出现的次数,注意若是单词需要分别写
grep 'm\{2\}' file_name #匹配字母m连续出现2次的行, 如 hsjmmjs
grep 'm\{2,4\}' file_name #匹配字母m出现次数在2到4次的文本# 其他示例
# 匹配一个IP地址
grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' file_name
# 匹配形如 "13445676789" 的字符串,开始和结束是双引号,中间是个11位数字
grep '"[0-9]\{11\}"' file_name
扩展正则表达式
grep使用时要加-E参数(好像不加也行?)
# 1. ? 与星号类似,但前面的字符只能出现0次或1次
#bet 匹配
#bt 匹配
#beet 不匹配
grep -E 'be?t' file_name
# 2. + 与星号类似,但前面的字符至少出现1次(注意点号是指当前位置必须有一个字符)
# bt 不匹配
# bet 匹配
# beeet 匹配
grep -E 'be+t' file_name
# 3.管道符 |, 逻辑或的意思
awk
工作流程: 读入有\n换行符分割的一条记录,然后将该记录按指定的域分隔符划分域(默认的域分隔符是空格符)
语法
awk 参数 ‘BEGIN{ commands } pattern { commands} END{commands}’
参数: -F 指定字段定界符,默认是空格,可以是正则表达式
pattern: 模式,可以是正则表达式,用来匹配每一行,使用//包裹, 如 /^tcp/表示匹配每一行开头以tcp开始
BEGIN内指定参数:
- RS 记录分隔符,默认是\n
- FS 同-F; FS="" 表示以空行切分记录
- ORS 记录输出分割符,默认\n
特殊参数:
- $0 所有域, $1 第一个域, $2 第二个域,以此类推
- $NF 表示一行中的最后一个字段
流程控制语法:
if(condition){} else if(condition){} else{}
循环语法:
for (i=0; i<3;i++){}
字符串函数
- length(string) 获取字符串长度(字符数)
- 拼接字符串时不需要使用任何修饰符,直接即可
- printf() 格式化输出,默认不输出换行符.
%s 字符; %d 整数,小数取整直接去除尾数; %.2f 小数,2表示小数点保留两位,最后一位四舍五入
printf("%.2f\n", 1.3374) 输出1.34 - split(string,array [,r]) 字符串拆分,返回拆分后数组大小string:待拆分的字符串,array:拆分后结果保存的数组,r:分隔符,可选,默认FS值;拆分后的数组下标从1开始,
for(k in arr){print arr[k]}
- substr(s,i [,n]) 字符串截取
s:待截取字符串;i:索引位置,从1开始;n:要截取的长度.默认截取到字符尾 - 字符串查找:index(s,t), match(s,r [,a])
返回第一次匹配成功的索引位置,从1开始,失败返回0
s: 待查找的字符串;t:目标子串
r: 查询的正则表达式, a 结果二维数组 - 字符串替换
- sub(r,s[,t]) 替换首次匹配到的子串,返回成功替换子串的数目,r 用于匹配的正则表达式,s 要替换的字符串值,t 目标字符串n,默认$0
- gsub(r,s[,t]) 用法同sub,替换所有匹配到的子串
- gensub(r,s,h[,t]) h: "g"表示全局替换,或是用数字指定子串出现的位置
时间函数
- systime() 返回精确到秒的当前时间戳
- mktime(date) 获取指定时间的时间戳,date格式: “YYYY MM DD HH MM SS”
- strftime() 转化时间字符串
注意
-
当字符串中含有单引号,转义写法如下:
# 此为打印单引号,比较字符串的单引号同理 awk '{print "'\''"}'
-
awk中比较在一个范围之内不能用连写方式,如 2<x<7是错误的,应写成 x>2 && x<7
-
awk 使用外部变量,需要在Action之后定义变量,如下所示使用外部test变量:
test=hhhhfudfhdhf awk '{print test}' test="$test" filename
grep
在命令之前加上LANG=C之后可大幅提高检索速度, 如 LANG=C grep -ia -B 1 Exception filename
参数说明:
- -i 忽略大小写
- -a 显示文本(当使用通配符搜索文件内容时,有时只显示匹配的文件名而不显示匹配的内容,用此参数即可)
- -e 指定多个匹配样式
- -c 计算找到的符合行的次数
- -n 输出匹配行的行号
- -v 反转查找
- -w 只显示全字符合的列
- -A n 打印匹配行和匹配行之后的n行
- -B n 打印匹配行和匹配行之前的n行
- -C n 打印匹配行和匹配行之前,之后的n行,共2n+1
- -h 在显示匹配行的那一列之前,不显示该列的文件名称
- -o 只输出文件中匹配到的部分
zgrep
可以搜索gz压缩文件内的内容. 用法同grep
sed
语法
sed options script file
默认不对原文件进行修改,处理的是原文件的拷贝
options参数:
- -n 取消默认的输出,仅显示处理后的结果
- -e 以选项中指定的script处理
- -i 直接修改原文件,慎用
script 参数:
- d 删除
- p 打印
- s 替换
注意
- 若在sed命令中使用外部的变量,此时匹配规则必须使用双引号
示例
# 打印第三行
sed -n '3p' file # 打印第200行到300行
sed -n '200,300p' file # 删除文件中的所有空白行
sed -n '/^$/d' file # 在每个有Statement行的下一行添加一个空行
sed '/Statemt/G' # 将文件中含有test字符串的行打印出来
sed -n '/test/p' test.txt # 将文件中my字符替换为Bob
sed 's/my/Bob/g' test.txt# 将文件中第三行替换为huang
sed -i '3s/.*/huang/' file
echo
-n 省略结尾的换行符,直接在文本后面输入
read
read value 读取用户输入
df
显示磁盘信息
- -a 所有
- -h 可读性较好显示
tail
从尾部显示文件
tail -n file
显示文件最后n行
tail -f file
实时查看文件内容, 一般查看实时查看日志文件用此命令
head
从头部显示文件
head -n file
显示文件的前n行
head -n file | tail -m
显示文件的m到n行
zip
压缩文件
- -q 不显示指令执行过程
- -r 递归处理
示例
#将 /home/db2/ddl目录下所有文件和文件夹压缩至当前目录的test.zip文件
zip -q -r test.zip /home/db2/ddl
typeset
设置变量
netstat
显示项Recv-Q, Send-Q表示网络接受队列,发送队列.一般情况下为0,可接受短暂的非0状态
ps
显示系统进程信息(linux中线程是伪线程,用轻量级进程来实现的,所以查看线程信息也是用此命令)
参数
- -ef 显示系统运行的所有进程信息
返回信息
- PID :该进程的进程ID号
- %CPU:该进程使用掉的 CPU 资源百分比
- %MEM:该进程所占用的物理内存百分比
- VSZ :该进程使用掉的虚拟内存量 (单位KB)
- RSS :该进程占用的固定的内存量 (单位KB)
- TTY :该进程表示在哪个终端机上面运作,其取值可能有如下几种
- ? 与终端机无关
- tty1-tty6 本机上面的登入者程序
- pts/0 由网络连接进主机的程序
- STAT:该程序目前的状态,主要的状态有
- R :该程序目前正在运作,或者是可被运作
- S :该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号(signal) 唤醒
- T :该程序目前正在侦测或者是停止了
- Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
- START:该进程被触发启动的时间
- TIME :该进程实际使用 CPU 运作的时间
crontab
定时任务.
参数
- -l 查看现有cron表中的内容
cron文件的语法如下:
f1 f2 f3 f4 f5 program
- 其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
- 当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
- 当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
- 当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
- 当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,其馀类推
示例
# 每一分钟执行一次
* * * * * program# 每天7:50执行一次
50 7 * * * program
创建定时任务步骤
(1) 创建文件,写入cron作业,如task.cron
(2) 运行 crontab task.cron命令即可
tee
运行结果同时输出到终端和文件
ls |tee log.log
du
显示文件或目录大小
- -c 显示所有已经显示的文件总大小
- -h 按友好模式显示
- -s 只显示目录总大小
scp
Linux服务器之间传输文件
# 传输aa.txt文件到206服务器的home目录下
scp aa.txt usroot@22.5.229.206:/home/# 206服务器下载aa.txt文件到本服务器当前路径:
scp usroot@22.5.229.206:/home/aa.txt .
sort
排序. 排序时以行为单位
- -r 下降排序,默认升序
- -n 按照数值大小排序
- -k 指定排序所依据的列数,从1开始
- -t 指定排序时的列分隔符
- -u 输出行中去除重复行
uniq
忽略文件中的重复行,常与sort一起使用
- -c 在每列旁边显示该行重复出现的次数
- -d 仅显示重复出现的行
- -u 仅显示唯一出现的行
top
实时显示系统进程情况.
以下命令为进入该命令之后执行:
- M 根据内存大小进行排序
- P 根据CPU使用百分比进行排序
- T 根据时间/累计时间排序
输出参数说明:
- 第一行相当于uptime命令输出
- 第一列时间表示当前系统时间
- 第二列 up 6 days 58min, 表示系统已经运行时间
- 第三列 2 users, 表示表示当前有2个用户在登陆
- 第四列 load average三个值分别表示系统1分钟,5分钟,15分钟平均负载
- 第二行 tasks信息表示系统运行的整体进程数量和状态信息
- zombie 僵尸进程数.
- 第三行 %Cpu(s)表示的是总体CPU使用情况
- us user 表示用户态的CPU时间比例. 当us很高时,证明CPU时间主要消耗在用户代码,需要优化用户代码
- sy system 表示内核态的CPU时间比例. 说明CPU时间都消耗在内核,要么是频繁的系统调用,要么是频繁的CPU切换(进程切换/线程切换)
- wa iowait 表示处于IO等待的CPU时间比例. 很高时,说明有进程在进程频繁的IO操作,有可能是磁盘IO,也有可能是网络IO
- ni nice 表示运行低优先级进程的CPU时间比例
- id idle 表示空闲CPU时间比例
- hi hard interrupt 表示处理硬中断的CPU时间比例
- si soft interrupt 表示处理软中断的CPU时间比例
- st steal 表示当前系统运行在虚拟机中的时候,被其他虚拟机占用的CPU时间比例
- 第4行. 内存使用情况, 单位KiB
- totol 表示总内存
- free 表示没使用过的内容
- used是已经使用的内存
- buff表示用于读写磁盘缓存的内存
- cache表示用于读写文件缓存的内存
- avail表示可用的应用内存
- 第5行, swap使用情况, 单位KiB, Swap原理是把一块磁盘空间或者一个本地文件当成内存来使用. 这三个值都为0表示系统关闭了swap功能,虚拟机一般都关闭swap功能
- Swap total表示能用的swap总量
- swap free表示剩余
- used表示已经使用的
- 之后为各个进程具体的信息.各字段说明如下
- PID 进程ID
- USER 进程所有者的用户名,例如root
- VIRT 进程使用的虚拟内存, 单位KB. 表示当前进程能够访问到的最大内存大小
- RES 进程使用的物理内存(不包括共享内存), 单位KB. 表示当前有多少物理内存被这个进程消费. 一般情况下看此值大小即可
- SHR 进程使用的共享内存. 单位KB
- CPU 进程使用的CPU占比
- MEM 进程使用的内存占比
- TIME 进程启动后到现在所用的全部CPU时间
- COMMAND 进程的启动命令(默认只显示二进制,top -c能够显示命令行和启动参数)
ls
ls -l 的输出内容格式如下:
-rw-r--r-- 1 root root 25934 Jun 26 10:35 X120
参数:
- -h 友好方式显示大小
- -a 所有
- -l 详细格式列表
- -t 用文件和目录的更改时间排序
- -r 反向排序
添加-l参数时详细输出参数说明:
- 第一列
- 第一个, 文件类型
- d 目录
- -文件,
- c 字符型文件
- b 块设备
- l 链接文件
- 接下来三个为一组,用来表示权限信息,其中 r 读, w 写, x 执行. 具体如下:
- 2,3,4:文件所有者权限
- 5,6,7:同用户组的权限
- 8,9,10:非本用户组的权限
- 第一个, 文件类型
- 第二列:有多少文件名连接到此节点
- 第三列:所有者账号
- 第四列:文件所属的用户组
- 第五列:文件大小,默认B
- 第六列:最近修改日期
示例:
# 仅显示目录名
ls -d */
stat
查看文件属性,包括文件创建时间
Access 访问时间,每读一次这个文件内容,就会更新
Modify 修改时间,对文件内容进行写操作,就会更新
Change 状态改变时间,通过chmod,就会更新
tar
tar -zcvf filename /home
split
分割大文件为多个小文件
参数:
- -b value 按value大小分割文件,即分割后每个文件大小为value(单位为byte)
- -l value 按行数分割文件,即分割后每个文件行数为value
- -d 使用数字作为文件名后缀
curl
不带任何参数, 默认发送get请求
参数:
-
-d 发送post请求的数据体
curl -d 'login=emma&password=123' -X POST
-
-H 设置请求头
curl -H 'Content-Type: application/json'
-
-o 将服务器回应保存成文件, 等同于wget
-
-s 不输出错误和进度信息
-
-X 指定请求的方法
curl -X POST
xargs
语法: xargs [-options] [command]
作用是将标准输入转为命令行参数
管道符|将左侧的标准输出转化为标准输入, 供右边命令使用, 但是这需要右边命令支持标准输入作为参数, 如grep是支持的, 下面命令是可以的.
ps -ef|grep java
但是很多命令不支持标准输入作为参数, 如echo, 下面这条命令没有任何输出
echo "sdsd"|echo
下面这条命令输出 sdsd
echo "sdsd"|xargs echo
参数:
- -d 指定分隔符,默认将换行符和空格作为分隔符,如制表符为"\t"
lsof
查看某个端口占用情况.一般查看端口冲突时可使用该软件.
value
- -d 使用数字作为文件名后缀
curl
不带任何参数, 默认发送get请求
参数:
-
-d 发送post请求的数据体
curl -d 'login=emma&password=123' -X POST
-
-H 设置请求头
curl -H 'Content-Type: application/json'
-
-o 将服务器回应保存成文件, 等同于wget
-
-s 不输出错误和进度信息
-
-X 指定请求的方法
curl -X POST
xargs
语法: xargs [-options] [command]
作用是将标准输入转为命令行参数
管道符|将左侧的标准输出转化为标准输入, 供右边命令使用, 但是这需要右边命令支持标准输入作为参数, 如grep是支持的, 下面命令是可以的.
ps -ef|grep java
但是很多命令不支持标准输入作为参数, 如echo, 下面这条命令没有任何输出
echo "sdsd"|echo
下面这条命令输出 sdsd
echo "sdsd"|xargs echo
参数:
- -d 指定分隔符,默认将换行符和空格作为分隔符,如制表符为"\t"
lsof
查看某个端口占用情况.一般查看端口冲突时可使用该软件.
lsof -i:port
发布评论