Linux 常用命令汇总
Linux命令太多,主要写写自己平时使用频率较高的常用命令,内容是自己的笔记内容,所以整个逻辑看起来会比较乱。每条认真看,看完会有收获哦。
文中会出现大部分的伪代码,只是帮助自己记忆的。
1.LINUX 常用命令:
常用快捷键:
contrl + c : 终止前台运行程序
contrl + z : 将前台任务挂起到后台(用多了容易占用过多系统资源)
contrl + l : 清屏
contrl + a : 光标移动到命令行最前端 ,类似于home
contrl + e : 光标移动到命令行最后 ,类似于end
contrl + u : 删除光标前所有字符
contrl + k : 删除光标后所有字符
contrl + y : 粘贴ctrl + u 或ctrl + k 的内容。
2.创建软链接:
ln -s [源文件或目录] [目标文件或目录] # 源文件的路径以绝对路径,后续移动链接文件时,任然可以使用源文件。
修改软链接:
ln -snf [新的源文件或目录] [目标文件或目录]
常用的参数:
-b 删除,覆盖以前建立的链接
-d 允许超级用户制作目录的硬链接
-f 强制执行
-i 交互模式,文件存在则提示用户是否覆盖
-n 把符号链接视为一般目录
-s 软链接(符号链接)
-v 显示详细的处理过程
3.改变文件或目录权限
chmod:
u : 所有者
g : 所属组
o : 其他人
a : 所有人
+ : 增加权限
- : 删除权限
= : 赋予新的权限
r : 读的权限
w : 写的权限
x : 执行权限
修改文件权限:
r 表示4 (二进制:100)
w 表示2 (二进制:010)
x 表示1 (二进制:001)
- 表示0 (二进制:000)
******************************************************************************************
4.正则表达式与通配符
正则表达式:用来匹配符合条件的字符串,正则是包含匹配。 grep sed awk 等可以支持正则表达式
通配符: 用来匹配符合条件的文件名,通配符是完全匹配,ls find cp 等不支持正则,只能使用shell自己的通配符来进行匹配。
基础正则表达式
* 前面有一个字符匹配0次或任意多次
. 匹配除了换行符外任意一个字符
^ 匹配行首。 如: ^hello 匹配以hello开头的行。
$ 匹配行尾。 如: hello$ 匹配以hello结尾的行。
[] 匹配中括号中指定的任意一个字符,只匹配一个字符。 如: [abcd] 匹配abcd中任意一个字母,[0-9] 匹配任意一个数字。[a-z][0-9] 匹配一个字母和一个数字构成的两字符。
[^] 匹配中括号的字符以外的任意一个字符。 如:[^0-9] 匹配任意一个非数字字符。
\ 转义字符,将特殊字符的含义取消。
\{n\} 表示其前面的字符恰好出现n次。 如:[0-9]{4} 匹配4为数字。 也可以写成[0-9]\{4\} \表示将{进行转义
\{n,\} 表示其前面的字符出现不小于n次 如:[0-9]{2,} 表示2为及两位以上的数字; 也可以写成[0-9]\{2,\}
\{n,m\} 表示其前面的字符至少出现n次,最多出现m次。 如:[a-z]{2,6} 表示匹配6-8位的小写字母; 也可以写成[a-z]\{2,6\}
5.常用通配符
* 匹配0或多个任意字符(可以匹配任何内容)
? 匹配任意单个字符
[list] 匹配[list] 中任意单个字符,或一组单个字符 , 如[a-z] 表示匹配所有的小写字母
[!list] 匹配除[list] 中任意单个字符,如[!a-z] 表示匹配所有的小写字母以外的字符
{string1,string2,...} 匹配string1,string2或更多字符串
6.bash 中的引号
" " 双引号,引号内的内容会被当做整体来看待,允许通过$符号引用其他变量值。
' ' 单引号,引号的内容会被当做整体看待,禁止引用其它变量值,也就是单引号括起来的只会被当做字符串来输出,不能作为命令。单引号中的所有特殊符号均没有特殊含义
` ` 反撇号,与$() 一样,引号或括号内的命令会优先执行。如果存在嵌套,`` 不能用。
$() 与反撇号一样,用来引用系统命令。
# 在shell脚本中,# 表示注释。
$ 用于调用变量的值,如需要调用变量的name时,需要通过 $name方式得到变量值。
\ 转义符,跟在\后的特殊字符都失去特殊含义。
变量可以放在双引号" " 中,不能放在单引号' '中。
引用变量可以使用: $name 或 "$name"
将命令进行引用使用 ` ls -l` 或 $(ls -l)
set 查看变量
unset 变量名
位置参数变量
$n n为数字, $0 表示命令本身,$1-9 代表第1个到第9个参数,10以上的参数需要大括号包含,如${10}
$* 代表命令中的所有参数,$* 把所有参数看成一个整体
$@ 代表命令行中所有参数,不过$@把每个参数区分对待
$# 代表命令行中所有参数的个数。
7.shell 基础输入输出重定向
标准输入: 0 键盘
标准输出: 1 显示器
标准错误输出: 2 显示器
输出重定向:改变输出方向,将命令执行结果由输出到屏幕改变成输出到文件。
标准正确输出重定向:
命令 > 文件 以覆盖的方式,将命令的正确输出,输出到指定的设备或文件中
命令 >> 文件 以追加的方式,把命令的正确输出,输出到指定的文件或设备中
ls -l > log.txt :将命令的输出结果保存到log.txt
标准错误输出重定向: [该方式基本很少用到,因为前提是必须指定自己输入的命令一定是错的,但明知道是错的,还输入,也没啥意义
错误命令 2> 文件 以覆盖的方式,把命令的错误输出,输出到指定的文件或设备中。 2和重定向直接不能有空格
错误命令 2>> 文件 以追加的方式,把命令的错误输出,输出到指定的文件或设备中。
标准正确输出和错误输出同时重定向:
命令 > 文件 2>&1 以覆盖的方式,把正确输出和错误输出都保存到同一文件当中。 等同于 命令 &> 文件
命令 >> 文件 2>&1 以追加的方式,把正确的输出和错误的输出都保存到同一文件中。 等同于 命令 &>> 文件
命令 >> 文件1 2>> 文件2 把正确的输出追加到文件1中,把错误的输出追加到文件2中。
[注: 2和重定向符号之间不能有空格]
输入重定向:
将文件作为命令输入: 命令 < 文件 (实际场景中使用不多)
****************************************************************
8.多命令顺序执行:
; 命令1 ; 命令2 多命令顺序执行,命令之间没有任何逻辑关系,就算第一条命令报错,第二条也会执行。
&& 命令1 && 命令2 逻辑与,当命令1正确执行,命令2才会执行,当命令1执行错误,命令2不会执行。(必选)
|| 命令1 || 命令2 逻辑或,当命令1执行错误,命令2才会执行,当命令1正确执行,命令2不会执行。(2选1)
比如统计某个程序执行耗费时间: date ; 命令1 ; date # 先记录时间,然后执行命令1,然后再执行时间。
9.shell 中条件判断
对数值型的条件判断:
整数1 -eq 整数2 : 判断整数1是否等于整数2 [ 2 -eq 4 ] && echo yes || echo no
整数1 -ne 整数2 : 判断整数1是否与整数2不相等
整数1 -gt 整数2 : 判断整数1是否大于整数2 (大于为真)
整数1 -lt 整数2 : 判断整数1是否小于整数2 (小于为真)
整数1 -ge 整数2 : 判断整数1是否大于等于整数2 (大于等于为真)
整数1 -le 整数2 : 判断整数1是否小于等于整数2 (小于等于为真)
对字符串的条件判断:
-z 字符串 :判断字符串是否为空(为空返回真)
-n 字符串 : 判断字符串是否为非空(非空返回真)
字符串1 == 字符串2 : 判断字符串1是否等于字符串2 (相等返回真)
字符串1 != 字符串2 : 判断字符串1 是否和字符串2不相等 (不相等返回真)
在linux中如果直接写3>4 直接报错, 可以通过test进行测试,格式如下。
[ 2 -eq 4 ] &&echo yes || echo no 判断2是否等于4,返回结果为no 注意"[]" 中括号两边必须留有空格,否则报错。
[ aa == ab ] && echo yes || echo no 判断aa是否和ab相等,返回结果no
注 : 在shell 中,使用"==" 双等号来比较两个字符串是否相同(内容是否同) , 使用-eq 来比较两个整数是否相等。
对文件类型进行判断:
-b 文件 :判断该文件是否存在,并且是否为设备文件(是块设备文件为真) 使用较少。
-d 文件 :判断文件是否存在,并且是否为目录文件(是目录文件为真),使用较多。
-e 文件 :判断文件是否存在(存在为真), 使用较多。
-f 文件 :判断文件是否存在,并且是否为普通文件(是普通文件为真),使用较多。
-s 文件 :判断文件是否存在,并且是否为非空(非空为真)
-L 文件 :判断文件是否存在,并且是否为符号链接文件(是符号链接文件为真),使用较多。
对文件权限进行判断:
-r 文件 :判断文件是否存在,并且该文件是否拥有读的权限(有读权限为真)
-w 文件 :判断文件是否存在,并且该文件是否拥有写的权限(有写权限为真)
-x 文件 :判断文件是否存在,并且该文件是否拥有执行的权限(有执行权限为真)
多重条件判断:
判断1 -a 判断2 :逻辑与,判断1和判断2都成立,最终结果才为真。
判断1 -o 判断2 :逻辑或,判断1和判断2有一个成立,最终结果为真。
!判断 :逻辑非,使原始的判断取反。
10.grep : 行过滤工具,用于根据关键字进行行过滤。
grep [选项] 关键字 文件名
-i : 不区分大小写
-v : 查找内容不包括指定内容的行,反向选择
-w : 按单词进行搜索, 否则会按照给出的字母进行选择
-o : 打印出匹配到的关键词,只是关键词,不含其他内容
-c : 统计匹配到的行数,直接输出为数字
-n : 显示匹配的行编号
-r : 逐层遍历目录查找
-l : 只列出匹配的文件名
-e : 使用正则匹配
-A : -A 5 表示匹配到的关键字及其后5行
-B : -B 5 表示匹配到的关键字及其前5行
-C : -C 5 表示匹配到的关键字及其前5行和后5行
^key : 以key关键字开头
key$ : 以key关键字结尾
^$ : 匹配空行
11.cut : 列截取工具,用于列截取
cut [选项] 文件名
-b : 以字节为单位进行分割。
-c : 以字符为单位进行分割,截取。 选项后紧接数字范围,表示截取每行的第几个字符。 cut -c2-5 file 表示按列截取每行的第2-5个字符。
-d : 自定义分割符,默认为制表符 \t 选项后需紧接分隔符,例:cut -d:-f1 file 表示以:进行分割,截取第1列的值.
-f : 与-d 一起使用,指定截取哪个区域。 选项后紧接数字,表示取截取后的哪一列值。 例:cut -d" " -f1 file 表示以" "进行分割,截取第1列的值.
12.sed : 流编辑工具
sed [选项] 参数 文件名
-i : 直接修改原文件 sed -i "1d" file 表示删除文件的第1行。1[第一行] d[删除的意思]
sed -i "nd" file 删除文件第n行
sed -i "$d" file 删除文件的最后一行
sed -i "1,5d" file 删除文件的第1到第5行
sed -i "10,$d" file 删除文件的第10行到最后一行
-a : 追加内容,不会修改原文件
sed '2a hello world' log.txt #在log.txt文件的第2行添加一行为 hello world
-d : 删除行
sed '3d' file 删除file文件的第三行
sed '/Mills/d' file 删除file文件中包含"Mills" 的行。 在linux中/ / 表示匹配,包含等意思。
-s : 替换字符。
sed -i "s/原字符串/替换字符串/g" file 替换文件中的内容。 其中,g表示全局替换
sed -i "1,5s/原字符串/替换字符串/" file 将文件的1到5行中原字符串进行替换,其余不变。
-n :查看文件指定行内容
sed -n '2,5p' log.txt 查看文件的第2行到第5行
sed -n '2p;3,8p' log.txt 查看文件的第2行,第3到第8行。 注意是分号隔开。
13.sort 排序工具
将文件的每一行作为一个单位,从首字符向后,依次按照ASCII码值进行比较,最后按照升序输出。
sort [选项] 参数 文件名
-f : 忽略大小写
-u : 去除重复行输出
-r : 降序排列,默认是升序
-o : 将排序结果输出到指定文件中,类似于重定向功能
-n : 以数字型排序,默认是按字符进行排序
-t : 指定分隔符 一般-t 与-k一起使用, sort -t: -k2 file 表示以:进行分割,对分割后的第2列进行排序。(也就是按照第2列的首字符进行排序)
-k : 按照指定的字段范围进行排序,-k [n,m] 从第n个字段开始,m个字段结束(默认到行尾)
-R : 随机排序
14.tee : 标准输入读取并写入标准输出文件中,及双向覆盖重定向(屏幕输出 | 文本输入)
echo hello world | tee file 屏幕打印hello world 并将hello world 写入到文件file中。
15.diff : 比较两个文件的不同,告诉怎么对第一个文件进行修改可以与第二个文件进行匹配。
diff [选项] 文件1 文件2 :结果中的 + 表示第一个文件需要加上该行才能与第二个文件匹配,- 表示需要删除改行才能与第二个文件匹配 ! 表示需要进行修改才能匹配
-b : 不检查空格
-B : 不检查空白行
-i : 不检查大小写
-w : 忽略所有的空格
-c : 上下文格式显示
-u : 合并格式显示
16.paste :文件行合并工具
paste [选项] 文件1 文件2
paste file1 file2 将file1 和file2 文件按照行进行合并,分割符是tab
paste -d: file1 file2 将file1 和file2 文件按照行进行合并,分割符是:
paste -s file1 file2 将file1文件和file2文件分别按行保存。
17.tr : 用于字符串转换,替换和删除。一对一替换,将匹配中的字符替换为另一个字符。
-d : 删除string1中所输入的字符
-s : 删除所有重复出现的字符,只保留第一个。 例: echo "aaabbbssssffffsdsd" | tr -s [abdf] 结果为:absfsdsd 也就是如果是连续重复的值会保留一个,其余删除不显示。sdsd虽然重复,但是不是连续重复,因此都会保留。
用法1:将命令结果交给tr处理,string1用于查询,string2用于转换处理
command | tr "string1" "string2"
用法2:tr处理的文件来自于文件,需要使用 < 标准输入。
tr "string1" "string2" < filename
tr "a-z" "A-Z" < file 将所有file文件中的小写字母转换成小写字母
tr ":/" "#" < file 将所有的:/ 替换成 #
tr -d "a-z" < file 删除文件中的所有小写字母,不会修改源文件内容。
18.uniq : 去除连续的重复行 【连续】
-i : 忽略大小写
-c : 统计重复行次数
-d : 只显示重复行
19.find 查找命令
根据文件名字查找:
find [查找范围] -name [搜索文件名]
find ./linux_test -name "log.*"
根据文件大小查找:
find ./linux_test -size +20480 -a -size +40960 #查找的文件大于20480K且小于40960k -a 表示逻辑与 -o 表示逻辑或。
**************************************************************************************
LINUX 三剑客之一(重点掌握)
**************************************************************************************
20.AWK : 文本处理工具
awk [options] 'Pattern{Action}' file
awk 最常用的action 是print:
awk {print} file : 打印file文件的全部内容
awk {print $5} file : 打印file文件的第5列 注明: awk 默认分割符是空格,如果没有指定分隔符,awk会以空格进行分割,然后输出指定的列。
awk 是逐行处理文本的,也就是处理文本时,会一行一行进行处理,处理完当前行,再处理下一行,因此是默认以换行"\n" 作为标记,识别每一行。
$0 表示显示整行 , $NF 表示当前行分割后的最后一列($0 和$NF 均为内置变量) 假如一行文本被空格分成了7段,那么NF的值就是7,$NF的值就是$7, 而$7表示当前行的第7个字段,也就是最后一列,那么每行的倒数第二列可以写为$(NF-1)
awk '{print $1,$2}' file : 打印file文件的第1,2列
awk '{print $1,"aaa"}' file : 打印file文件的第1列,并在第1列后均添加一个全是aaa的列。 注意: $1 必须在双引号外,否则会将$1当做字符串"$1" 输出了。
awk '{print "DD:" $1,"BB:" $2}' file : 打印file文件的第1列和第2列,并在打印的第一列前面全部添加"DD:",在第2列前面全部添加"BB:"。 可以实现指定字符与每一列进行拼接,较灵活。
awk另一个参数Pattern ,其中两个特殊模式: BEGIN 和END
BEGIN : 指定了处理文本之前需要进行的操作
END :指定了处理文本之后需要进行的操作
格式为 : awk 'BEGIN{print " "}{print " "}END{print " "}'
awk 'BEGIN{print "this is begin"}{print $1}' file : 先打印"this is begin" ,然后打印file文件的第1列。
awk '{print $1}END{print "this is end"}' : 先打印file文件的第1列,然后打印"this is end"。 注明: BEGIN 和END 打印的内容都会显示在一起。也就是相当于自定义添加表头和表尾内容
awk option参数:
awk 分隔符有两种 : 输入分隔符和输出分隔符
输入分隔符 : filed separator 简称 FS ,默认分隔符是空白分隔符,也就是空格
输出分隔符 : output filed separator 简称 OFS , 默认输出分隔符也是空格。 也就是使用awk打印出的值,默认是按照空格分隔符进行分隔的。
awk -F "#" '{print $1}' file : 将file 文件按照指定分隔符"#" 进行分隔,然后打印第1列的值
awk -v FS= "#" '{print $1}' file : 与上面的效果一样。 只是FS 是awk内置变量 需和-v一起使用,-v 表示指定对应的变量。
awk -v FS= "#" -v OFS="--" '{print $1,$2}' file : 将file文件按照#进行分隔,然后打印第1和2列,然后输出第1列与第2列时,中间以"--"进行连接。
如果要实现打印出的列直接不含空格,可以在需要打印的列之间不使用"," :
awk -v FS= "#" '{print $1 $2}' file : 将$1与$2写在一起,可以实现打印出的第1列与第二列显示在一起。区别在于是否在需要打印的列之间添加","
awk 变量:
变量分为自定义变量(用户自己定义的) 和内置变量,内置变量如下:
FS:输入字段分隔符, 默认为空白字符
OFS:输出字段分隔符, 默认为空白字符
RS:输入记录分隔符(输入换行符), 指定输入时的换行符
ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NF:number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量
NR:行号,当前处理的文本行的行号。
FNR:各文件分别计数的行号
FILENAME:当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数
21.for 循环:
for 循环的两种模式:
模式1 :
for i in 值1 值2 值3 ... [变量的值是以空格进行分隔的]
do
执行程序
done
(for 循环次数取决于变量i的个数,第一次循环将值1赋值给变量i,第二次循环将值2赋值给变量i,依次类推。)
示例:for time in morning noon afternoon evening
echo "this time is $time!"
done
模式2 :for((初始值;循环控制条件;变量变化))
do
执行程序
done
(初始值: 在循环开始时,需要给某个变量赋初始值,如i=1
循环控制条件: 用于指定变量循环次数,如i<=100,则只要i值小于等于100,循环就会继续;
变量变化:每次循环后,变量如何变化,如i=i+1
示例: for ((i=1;i<=100;i=i+1))
sum=$sum+$i
done
22.while 循环:
模式:
while [ 条件判断式 ]
do
执行程序
done
while 循环只有条件成立,循环就会一直继续,直到条件不成立,循环才会停止。
23.until 循环:
until [ 条件判断式 ]
do
执行程序
done
until循环与while循环相反,只有条件判断式不成立则进入循环,并执行循环过程。一旦条件成立,循环终止。
24.if 条件判断
单分支条件语句:
if [ 条件判断式 ] []的前后必须有空格,否则报错!,then在if语句后,需要添加分号;如果另取一行,则不需要分号
fi
双分支if条件语句:
if [ 条件判断式 ]
条件成立时,执行程序
条件不成立时,执行程序
fi
多分支if条件语句:
if [ 条件判断式1 ]
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]