kr1: 整理50条非常用shell命令,并列出它的用法,并在shell下实践其一种或多种用法
1. grep---主要用于搜索文件里内容
> grep [选项] '关键字' 文件名
OPTIONS:
-i: 不区分大小写
-v: 查找不包含指定内容的行,反向选择
-w: 按单词搜索
-o: 打印匹配关键字
-c: 统计匹配到的行数
-n: 显示行号
-r: 逐层遍历目录查找
-l:只列出匹配的文件名
-L:列出不匹配的文件名
-e: 使用正则匹配
-E:使用扩展正则匹配
^key:以关键字开头
key$:以关键字结尾
^$:匹配空行
--color=auto :可以将找到的关键词部分加上颜色的显示
注意事项:只有前面有-r选项的时候,可以在文件夹里查找
只想打印含匹配内容的文件名时,加-l,反之不包含的文件名加-L,
不加-l或-L会打印:对应文件名及包含匹配内容的一整行
只打印匹配的内容:-o
在某个目录下查找文件名中:ls |grep ‘关键字’
2. find---主要搜索文件和目录
find [path] [expression]
[path]:搜索的起始目录
[expressions]: 搜索条件,文件名,文件类型,修改时间等
-name: 按文件名搜索
-type: 按文件类型搜索,如普通文件、目录等。目录:-d;文件:-f
-mtime/-atime/-ctime: 按文件的修改时间、访问时间、状态改变时间搜索。单位:天
-mmin/-amin/-cmin: 。。。。。单位:分钟
过去的n天内:-n;
-size: 按文件大小搜索
-exec: 对搜索到的文件执行指定的命令
-perm: 根据文件权限查找
-user:根据文件所有者
-not:反向查找,查找不匹配的,可以用 ! 代替
-maxdepth: 查找深度
-empty:空文件,空目录,查找空
[expressions]支持逻辑操作符:-a (和)、-o(或)和!(非),通常用括号围起来,但括号前要用转义符: \
如:find ./ -name '*.txt' -exec rm {} \;
在多个目录下查找:find path1 path2 expressions
查找隐藏文件的expression:-name ".*"
3. sort工具--文件内容排序
将文件的每一行作为一个单位,从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
-u :去除重复行
-r :降序排列,默认是升序
-o : 将排序结果输出到文件中,类似重定向符号>
-n :以数字排序,默认是按字符排序
-t :分隔符
-k :第N列
-b :忽略前导空格。
-R :随机排序,每次运行的结果均不同
4.uniq工具--去重
uniq用于去除连续的重复行
常见选项:
-i: 忽略大小写
-c: 统计重复行次数
-d: 只显示重复行
5.tee工具--重定向
tee工具是从标准输入读取并写入到标准输出和文件,即:双向覆盖重定向(屏幕输出|文本输入)
选项:
-a: 双向追加重定向
6.diff工具--比较
diff工具用于逐行比较文件的不同或目录的不同
注意:diff 描述两个文件不同的方式是告诉我们怎样改变第一个文件之后与第二个文件匹配。
语法:
diff [选项] 文件1 文件2
常用选项:
-b: 不检查空格
-B: 不检查空白行
-i: 不检查大小写
-w: 忽略所有的空格
--normal: 正常格式显示(默认)
-c: 上下文格式显示
-u: 合并格式显示
-q: 仅显示有无差异,不显示详细的信息
有时候我们需要以一个文件为标准,去修改其他文件,并且修改的地方较多时,我们可以通过打补丁的方式完成。
例:file2是标准,将file1修改一致
# 1)先找出文件不同,然后输出到一个文件
> diff -uN file1 file2 > file.patch
-u: 合并上下文模式
-N: 将不存在的文件当作空文件
# 2)将不同内容打补丁到文件
> patch file1 file.patch
patching file file1
# 3)测试验证
> diff file1 file2
7. patch--打包工具
将一个文件或一组文件的差异应用于另一个文件集,以更新或修改这些文件
基本语法:
patch [options] [originalfile] [patchfile]
但是,通常我们会将补丁文件重定向到patch命令:patch < /path/to/patchfile
常用的选项:
-p/--strip:指定补丁文件中的路径前缀
-i:指定补丁文件的路径和名称
-o:指定补丁文件的输出路径和名称
-r:指定补丁文件的备份路径和名称
-R/--reverse: 反转补丁/撤销补丁
-l/--ignore-whitespace: 忽略空白字符的更改
--dry-run: 查看补丁内容
步骤:
生成补丁: git diff / diff file1 file2 > file.patch
应用补丁:patch ...
撤销补丁:patch -R -p <剥离层级> <已应用补丁的文件>
8. sed--以行为单位的流式文本编辑器
sed [option] 'command/' [input_file]
可用于替换、删除、插入、打印等操作
常用选项:
-e: 允许在命令行中指定多个编辑命令
-n:加-n表示安静模式,只有经过处理的那行才会显示在终端上,否则将会显示所有的行。
-i:修改文件内容。例如在替换字符串的时候,不添加此项的话,只会在显示时修改,文件无变化。
#说明:
-ir 不支持
-i -r 支持
-ri 支持
-ni 会清空文件
1. 替换文本:sed 's/pattern/replacement/' input_file
2. 全局替换: sed 's/pattern/replacement/g' input_file
3. 替换特定行: sed '5s/pattern/replacement/g' input_file
4. 删除特定行: sed '5d' input_file
5. 插入文本: sed '5i\inset this line' input_file
6. 删除包含banana的行:sed '/banana/d' input_file
7. 删除每行前7个字符: sed 's/^.\{7\}//' input_file
9. dirs--显示目录栈。 显示当前记住的目录列表。
dirs: dirs [-clpv] [+N] [-N]
显示目录栈。
显示当前记住的目录列表。通过 `pushd' 命令可以将目录存入列表中;`popd' 命令可用于遍历列表。
选项:
-c 删除所有元素以清空目录栈
-l 不打印与主目录相关的波浪号前缀的目录
-p 每行一个条目打印目录栈
-v 每行一个条目,以栈中位置为前缀打印目录栈
参数:
+N 显示 dirs 不带选项启动时显示的目录列表左起中第N 个目录,从零开始。
-N 显示 dirs 不带选项启动时显示的目录列表右起中第N 个目录,从零开始。
退出状态:
返回成功,除非使用了无效的选项或者发生错误。
10. pushd--将目录添加到栈中
[root@testserver ~]# help main pushd
pushd: pushd [-n] [+N | -N | dir]
将目录添加到目录栈顶,或着旋转栈直到当前工作目录成为 新的栈顶。不带参数时,交换栈顶的两个目录。
选项:
-n 抑制添加目录至栈时通常的改变目录操作,从而仅对栈进行操作。
参数:
+N 旋转栈从而第 N 个目录(`dirs' 显示的列表中左起,从零开始)将移动到栈顶。
-N 旋转栈从而第 N 个目录(`dirs' 显示的列表中右起,从零开始)将移动到栈顶。
dir 将 DIR 目录添加到栈顶,并且使其成为当前工作目录。
`dirs' 内嵌显示目录栈。
退出状态:
返回成功,除非使用了无效的参数或者目录转换失败。
11.declare--定义变量和函数属性的命令
declare [选项][变量或函数名=值] 给变量做一些限制
-a:定义普通数组
-A: 定义关联数组
-f: 将输出函数的定义
-i:将变量定义为整数
-r:将变量定义为只读
-x:将变量导出为环境变量
-p:显示指定的变量或函数的属性
declare -A 声明一个关联数组
声明:declare -a fruits=("apple""banana""orange")
访问:${fruits[0]}
修改:fruits[1]='cherry'
遍历: for fruit in "${fruits[@]}"
do
echo "$fruit"
done
12.变量定义与调用
1. 定义变量规则:
变量名区分大小写
变量名不能有特殊符号
变量名不能以数字开头
等号两边不能有任何空格
变量名尽量做到见名知意(一般变量名使用大写)
2.
变量定义: A='hello'
调用:$A 或 ${A} 区别:${A}可以只截取变量的一部分,而$A不可以
取消变量:unset A
3. 交互式定义变量
read [option] 变量名
option:
-p : 定义提示用户的信息
-n:定义字符数
-s: 不显示用户输入的内容
-t:定义超时时间
例:
1)用户从命令行输入
> read -p "Input your name:" name
Input your name:tom
> echo $name
tom
2)从文件读取
> cat 1.txt
10.1.1.1 255.255.255.0
> read ip mask < 1.txt
> echo $ip
10.1.1.1
> echo $mask
255.255.255.0
13:环境变量--env、set、export
环境变量:当前进程有效,并且能够被子进程调用。
env:查看系统的环境变量
set:查询当前用户的所有变量(本地变量与环境变量)
export 变量名=变量值:定义环境变量(或者 变量名=变量值;export 变量名)
14. 本地变量与全局变量
本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。
全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用.
文件名 | 说明 | 备注 |
$HOME/.bashrc | 当前用户的bash信息,用户登录时读取 | 定义用户的别名、umask、函数等 |
$HOME/.bash_profile | 当前用户的环境变量,用户登录时读取 | 定义用户的环境变量 |
$HOME/.bash_logout | 当前用户退出当前shell时最后读取 | 定义用户退出时执行的程序等 |
/etc/bashrc | 全局的bash信息,所有用户都生效 | 系统和所有用户都生效,用来定义全局的别名、umask、函数等 |
/etc/profile | 全局环境变量信息 | 系统和所有用户都生效,用来定义全局变量 |
说明:以上文件修改后,都需要重新 source
让其生效或者退出重新登录。
- 用户登录系统读取相关文件的顺序:
/etc/profile
$HOME/.bash_profile
$HOME/.bashrc
/etc/bashrc
$HOME/.bash_logout
15.系统变量
- 系统变量(内置bash中变量) : shell 本身已经固定好了它的名字和作用.
16.简单四则运算
17. 普通数组
普通数组:只能使用整数作为数组索引(元素的下标)
1.定义
数组名[索引下标]=值
或 数组名=(var1 var2 var3 var4)
2.数组读取
${数组名[元素下标]}
echo ${array[0]} 获取数组里第一个元素
echo ${array[*]} 获取数组里的所有元素
echo ${#array[*]} 获取数组里所有元素个数
echo ${!array[@]} 获取数组元素的索引下标
echo ${array[@]:1:2} 访问指定的元素;1代表从下标为1的元素开始获取;2代表获取后面几个元素
查看普通数组信息:
> declare -a
18.关联数组
关联数组:可以使用字符串作为数组索引(元素的下标)
1.定义
先声明:declare -A 数组名
再赋值:数组名[索引or下标]=变量值
数组名=([name1]=val1 [name2]=val2 [name3]=val3)
其他定义方式:
> declare -A books
> let books[linux]++
> declare -A|grep books
declare -A books='([linux]="1" )'
> let books[linux]++
> declare -A|grep books
declare -A books='([linux]="2" )'
2.查看数组:declare -A
3.获取关联数组值:
> echo ${asso_array1[linux]}
one
> echo ${asso_array1[php]}
three
> echo ${asso_array1[*]}
three two one
> echo ${!asso_array1[*]}
php java linux
> echo ${#asso_array1[*]}
3
> echo ${#asso_array2[*]}
4
> echo ${!asso_array2[*]}
name3 name2 name1 name4
19. dirname和basename
dirname:取出一个文件所在目录
basename:取出文件名字
> A=/root/Desktop/shell/test.txt
>dirname $A
/root/Desktop/shell
>basename $A
test.txt
20.变量内容的删除和替换
一个“%”代表从右往左删除
两个“%%”代表从右往左去掉最多
一个“#”代表从左往右去掉删除
两个“##”代表从左往右去掉最多
举例说明:
> url=www.taobao.com
> echo ${#url} #14 获取变量的长度
> echo ${url#*.} #taobao.com
> echo ${url##*.} #com
> echo ${url%.*} #www.taobao
> echo ${url%%.*} #www
/:从左往右第一个
//:替代所有
> echo ${url/ao/AO} #www.tAObao.com
> echo ${url//ao/AO} #www.tAObAO.com
${变量名-新的变量值} 或者 ${变量名=新的变量值}
变量没有被赋值:会使用“新的变量值“ 替代
变量有被赋值(包括空值): 不会被替代
${变量名:-新的变量值} 或者 ${变量名:=新的变量值}
变量没有被赋值或者赋空值:会使用“新的变量值“ 替代
变量有被赋值: 不会被替代
------------------------------------------------
${变量名:+新的变量值}
变量没有被赋值:不会使用“新的变量值“ 替代
变量有被赋值(包括空值): 会被替代
${变量名+新的变量值}
变量没有被赋值或者赋空值:不会使用“新的变量值“ 替代
变量有被赋值: 会被替代
------------------------------------------------
${变量名?新的变量值}
变量没有被赋值:提示错误信息
变量被赋值(包括空值):不会使用“新的变量值“ 替代
${变量名:?新的变量值}
变量没有被赋值或者赋空值时:提示错误信息
变量被赋值:不会使用“新的变量值“ 替代
说明:?主要是当变量没有赋值提示错误信息的,没有赋值功能
------------------------------------------------
21.条件判断语句
1. 条件判断语法格式
格式1: test 条件表达式
格式2: [ 条件表达式 ] (注意中括号与表达式之间有空格)
格式3: [[ 条件表达式 ]] 支持正则(注意中括号与表达式之间有空格)
2. 条件判断相关参数
(1)判断文件类型
判断参数 含义
-e 判断文件是否存在(任何类型文件)
-f 判断文件是否存在并且是一个普通文件
-s 判断文件是否存在并且是一个非空文件(有内容)
-d 判断文件是否存在并且是一个目录
-L 判断文件是否存在并且是一个软连接文件
-b 判断文件是否存在并且是一个块设备文件
-S 判断文件是否存在并且是一个套接字文件
-c 判断文件是否存在并且是一个字符设备文件
-p 判断文件是否存在并且是一个命名管道文件
(2)判断文件权限
判断参数 含义
-r 当前用户对其是否可读
-w 当前用户对其是否可写
-x 当前用户对其是否可执行
-u 是否有suid,高级权限冒险位
-g 是否sgid,高级权限强制位
-k 是否有t位,高级权限粘滞位
(3)判断文件新旧
说明:这里的新旧指的是文件的修改时间。
判断参数 含义
file1 -nt file2 比较file1是否比file2新
file1 -ot file2 比较file1是否比file2旧
file1 -ef file2 比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode
(4)判断整数
判断参数 含义
-eq 相等
-ne 不等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
(5)判断字符串
判断参数 含义
-z 判断是否为空字符串,字符串长度为0则成立
-n 判断是否为非空字符串,字符串长度不为0则成立
string1 = string2或 string1 == string2 判断字符串是否相等
string1 != string2 判断字符串是否相不等
(6)多重条件判断
判断符号 含义 举例
-a 和 && 逻辑与 [ $(id -u) -eq 1 -a 1 -ne 0 ] 或 [ 1 -eq 1 ] && [ 1 -ne 0 ]
-o 和 || 逻辑或 [ 1 -eq 1 -o 1 -ne 1 ]
特别说明:
&& 前面的表达式为真,才会执行后面的代码
|| 前面的表达式为假,才会执行后面的代码
; 只用于分割命令或表达式
② 逻辑运算符总结
符号 ; 和 && 和 || 都可以用来分割命令或者表达式
分号 ; 完全不考虑前面的语句是否正确执行,都会执行 ; 号后面的内容
&& 符号,需要考虑 && 前面的语句的正确性,前面语句正确执行才会执行 && 后的内容;反之亦然
|| 符号,需要考虑 || 前面的语句的非正确性,前面语句执行错误才会执行 || 后内容;反之亦然
如果 && 和 || 一起出现,按照以上原则,从左往右依次执行
22 bash快捷键
^c 终止前台运行的程序
^z 将前台运行的程序挂起到后台(暂停运行)
^d 退出 等价exit
^l 清屏
^a |home 光标移到命令行的最前端
^e |end 光标移到命令行的后端
^u 删除光标前所有字符
^k 删除光标后所有字符
^r 搜索历史命令
23 bash常用通配符
*: 匹配0或多个任意字符
?: 匹配任意单个字符
[list]: 匹配[list]中的任意单个字符,或者一组单个字符 [a-z]
[!list]: 匹配除list中的任意单个字符
{string1,string2,...}:匹配string1,string2或更多字符串
> touch file{1..3}:创建文件:file1,file2,file3
> touch file{{1..3},5}:创建文件:file1,file2,file3,file5
24 bash中的引号
- 双引号
""
:会把引号的内容当成整体来看待,允许通过$
符号引用其他变量值 - 单引号
''
:会把引号的内容当成整体来看待,禁止引用其他变量值,shell 中特殊符号都被视为普通字符 - 反撇号
``
: 反撇号和$()
一样,引号或括号里的命令会优先执行,如果存在嵌套,反撇号不能用
25 流程控制语句
(1)if结构
if [ condition ];then
command
command
fi
if test 条件;then
命令
fi
if [[ 条件 ]];then
命令
fi
[ 条件 ] && command
(2)if…else结构
if [ condition ];then
command1
else
command2
fi
[ 条件 ] && command1 || command2
(3)if…elif…else结构
if [ condition1 ];then
command1
elif [ condition2 ];then
command2
else
command3
fi
26. for循环语句
循环体: do…done之间的内容
26.1 语法结构
(1)列表循环
for variable in {list}
do
command
command
…
done
或者
for variable in a b c
do
command
command
done
例:
> for var in {1..10};do echo $var;done
> for var in 1 2 3 4 5;do echo $var;done
> for var in `seq 10`;do echo $var;done
> for var in {0..10..2};do echo $var;done # {起始..结尾..步长}
> for var in {2..10..2};do echo $var;done
> for var in {10..1};do echo $var;done
> for var in {10..1..-2};do echo $var;done
> for var in `seq 10 -2 1`;do echo $var;done # seq 起始 步长 结尾
(2)不带列表循环
for variable
do
command
command
…
done
例:
#!/bin/bash
for var
do
echo $var
done
echo "脚本后面有$#个参数"
(3)类C风格的for循环
# expr1:定义变量并赋初值
# expr2:决定是否进行循环(条件)
# expr3:决定循环变量如何改变,决定循环什么时候退出
for(( expr1;expr2;expr3 ))
do
command
command
…
done
例:
for (( i=1;i<=5;i++))
do
echo $i
done
26.2 循环控制语句
continue
:继续;表示循环体内下面的代码不执行,重新开始下一次循环break
:打断;马上停止执行本次循环,执行循环体后面的代码exit
:表示直接跳出程序shift
:使位置参数向左移动,默认移动1位,可以使用shift 2
(参考案例2)
27. while循环语句
特点:条件为真就进入循环;条件为假就退出循环
while 表达式
do
command...
done
# 从文件中获取参数,以空格分隔
while read 参数1 参数2
do
useradd $user
echo $pass|passwd --stdin $user
done < 文件
28. until循环
特点:条件为假就进入循环;条件为真就退出循环
until 表达式
do
command
command
...
done
29. 随机数
# 打印一个随机数
> echo $RANDOM
# 查看系统上一次生成的随机数
> set | grep RANDOM
RANDOM=28325
#产生0~100内的随机数
> echo $[$RANDOM%101]
#产生50-100之内的随机数
> echo $[$RANDOM%51+50]
#产生三位数的随机数
> echo $[$RANDOM%900+100]
30.top 查看linux系统的cpu占用率
该命令会打印出系统正在运行的进程和相应的资源占用情况,包括CPU占用率、内存占用率等
31. df 查看linux系统的磁盘使用情况
该命令会打印出系统中每个文件系统的使用情况,包括已用空间、剩余空间等
按人查看内存占用大小:du -h --max-depth=1
32. netstat 查看Linux系统的网络连接情况
该命令会打印出系统中当前的网络连接状态,包括建立的连接、监听的端口等
33. 在Linux系统中安装软件包
在Debian/Ubuntu系统中,可以使用以下命令安装软件包:
apt-get install <package_name>
在CentOS/RHEL系统中,可以使用以下命令安装软件包:
yum install <package_name>
34.字符串操作
拼接字符串:直接拼接
greeting="Hello, "$name"!"
获取字符串长度:${#变量名}
echo ${#name}
子字符串:${变量名:起始位置:长度}
echo ${name:0:3} # 输出 "Ali"
35.函数
1. 定义函数:
greet() {
echo "Hello, $1!"
}
2. 调用函数:
greet "Alice"
36.输入输出
1. 读取输入:read
read -p "Enter your name: " name
2. 输出:echo 或 printf
echo "Hello, World!"
printf "Hello, %s!\n" "Alice"
37:文件操作
1. 重定向:
1.1 输出重定向:>(覆盖),>>(追加)
echo "Hello" > file.txt
echo "World" >> file.txt
1.2 输入重定向:<
cat < file.txt
2. 管道:|
cat file.txt | grep "Hello"