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 ];then
	command
fi
# if-else:
if [ condition ];then
	command
elif [ condition2 ];then
	command
else
	command
fi
# while语句:
while [ condition ];do
	command
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; do
	echo $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[@]}
do
	echo $item
done
# 遍历数组(每一项为数组下标)
for  i ${!arr[@]}
do
	echo $i
done

# 将某条命令执行的结果全赋值给数组
my_arr=(`awk '{print $2}' file.txt`)

for循环写法

# 循环10次
for i in $(seq 1 10)
do
	echo $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

实时显示系统进程情况.

20210104190258

以下命令为进入该命令之后执行:

  • 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 https://google.com/login
    
  • -H 设置请求头

    curl -H 'Content-Type: application/json' https://google.com/login
    
  • -o 将服务器回应保存成文件, 等同于wget

  • -s 不输出错误和进度信息

  • -X 指定请求的方法

    curl -X POST https://www.example.com
    

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 https://google.com/login
    
  • -H 设置请求头

    curl -H 'Content-Type: application/json' https://google.com/login
    
  • -o 将服务器回应保存成文件, 等同于wget

  • -s 不输出错误和进度信息

  • -X 指定请求的方法

    curl -X POST https://www.example.com
    

xargs

语法: xargs [-options] [command]

作用是将标准输入转为命令行参数

管道符|将左侧的标准输出转化为标准输入, 供右边命令使用, 但是这需要右边命令支持标准输入作为参数, 如grep是支持的, 下面命令是可以的.

ps -ef|grep java

但是很多命令不支持标准输入作为参数, 如echo, 下面这条命令没有任何输出

echo "sdsd"|echo

下面这条命令输出 sdsd

echo "sdsd"|xargs echo

参数:

  • -d 指定分隔符,默认将换行符和空格作为分隔符,如制表符为"\t"

lsof

查看某个端口占用情况.一般查看端口冲突时可使用该软件.

lsof -i:port

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值