Linux常用命令
0. 在线使用 Linux Shell
JS/UIX - Terminal
地址:https://www.masswerk.at/jsuix/index.html
进入后,点击open terminal即可。它提供简单的终端环境,没有自带gcc等编译套件,不过练习基本命令和shell脚本还是可以的。
1. 常用命令
1.1 ls 命令 - 显示指定工作目录下的内容
显示指定工作目录下的内容(列出目前工作目录所含之文件及子目录)
语法:
1 | ls [-alrtAFR] [name...] |
结合 grep
使用:
查看文件 log.txt 是否存在于当前目录下:
1 | >ls | grep log.txt |
1.2 查看文件内容:cat
1.3 创建文件: touch
此时,若想往text2中写入内容,可用
echo "hello word">>text2
>>
代表在末尾追加,若使用>
则会把之前的内容覆盖
当然,也可直接vim text2
对文件进行编辑
注:无论是 echo "hello">file
还是
echo "hello">>file
,如果file不存在都会先创建file文件
类似的用法有:cat ./result.lst>>aa.txt
(将result.lst文件中的内容追加到aa.txt的末尾)
1.4 mv - 为文件或目录改名、或将文件或目录移入其它位置
👆注:若test目录不存在,则该命令将text4重命名为test
1.5 rm - 删除一个文件或者目录
删除文件:rm 文件名
删除文件夹:rm -r 文件夹名
。-r
将目录及以下之档案亦逐一删除
-f
直接删除,无需逐一确认,见如下示例:
1.6 cp - 复制文件或文件夹
语法:
1 | cp [options] source dest |
例如,将当前路径下的a.txt复制到另外一个文件夹下:
1 | >cp a.txt /data/test/ |
将文件夹xgb_pipeline复制到另一个路径下:
1 | >cp -r xgb_pipeline /data/test/ |
将当前路径下的多个文件复制到另一个路径下:
1 | >cp a.txt b.json /data/test/ |
2. 压缩打包命令 - tar、zip、unzip
来自 https://blog.csdn.net/weixin_44901564/article/details/99682926
打包与压缩的区别:
打包是指将多个文件或者目录放在一起,形成一个总的包,这样便于保存和传输,但是大小是没有变化的,压缩是指将一个或者多个大文件或者目录通过压缩算法使文件的体积变小以达到压缩的目的,可以节省存储空间。
tar命令可以进行打包或压缩、解压,zip与unzip主要进行压缩与解压。 (用于压缩时,tar与zip的主要区别:tar命令主要用于unix系统下,zip命令主要用于windows 系统下。例如想要在unix系统压缩文件后传给windows系统使用,一般会使用zip命令,进行解压更加方便)
2.1 tar命令
tar命令常用参数
参数 | 描述 |
---|---|
-z | 是否同时具有gz属性 |
-j | 是否同时具有bz2属性 |
-J | 是否同时具有xz属性 |
-x | 解压缩、提取打包的内容 |
-t | 查看压缩包内容 |
-c | 建立一个压缩,打包文档 |
-C | 切换到指定目录,表示指定解压缩包的内容和打包的内容存放的目录 |
-v | 显示压缩或者打包的内容 |
-f | 使用文件名,在f后面要接压缩后的文件的名字,只要用到tar命令,-f选项是必须要用的,-f参数在使用的时候一定排在其他参数的后面,在最右边 |
-p | 保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件 |
-P | 保留绝对路径 |
2.1.1 打包
2.1.2 压缩
linux主要有三种压缩方式: 1.gzip:是公认的压缩速度最快,压缩大文件的时候与其他的压缩方式相比更加明显,历史最久,应用最广泛的压缩方式 2.bzip:压缩形成的文件小,但是可用性不如gzip 3.xz:是最新的压缩方式,可以自动提供最佳的压缩率
建议压缩的时候标明后缀:
参数 | 作用 | 命名方式 |
---|---|---|
-z | 用于gzip压缩方式 | 文件名.tar.gz |
-j | 用于bzip2压缩方式 | 文件名.tar.bz2 |
-J | 用于xz压缩方式 | 文件名.tar.xz |
2.1.3 解压
tar命令在解压时不需要指明压缩的方式,它会自己选择跟压缩方式对应的方式去解压
👆原文中未给出命令,猜测为 tar -xf Golden.apk.tar.gz
2.1.4 补充
a.在打包和压缩的过程中,我们有时会看到这样的语句:tar: 从成员名中删除开头的“/”,这个并不是报错,是因为没有加上-P选项,没有保留原来的绝对路径去打包或者压缩,提取打包的内容跟解压一样,下面举一个例子:
解压的时候同理,如果在压缩文件的时候使用了-P选项,那么在解压时也要加上-P选项,不然也会出现tar: 从成员名中删除开头的“/”
b.在使用tar压缩或者打包的时候,可以通过增加 --exclude
来达到排除指定的文件的目的
压缩文件 与 想要排除指定的目录压缩或者打包 同理
- 使用
-r
选项增加.tar归档文件的内容
通过 tar --help
命令查看帮助
-r
选项的作用:把要存档的文件追加到档案文件的未尾。例如用户已经作好备份文件,又发现还有一个目录或是一些文件忘记备份了,这时可以使用该选项,将忘记的目录或文件追加到备份文件中
使用实例:
(先将1进行归档,再追加2)
1.归档操作
生成.tar文件,目录归档完毕
2.将calculating_time.sh追加进入.tar文件中
查看.tar文件的归档信息:
可以看到calculating_time.sh文件已经被追加到档案的末尾了
提取Check_Configuration_20201118_PM.tar 到/mnt目录下:
使用-r选项追加文件至.tar文件成功
2.2 zip命令和unzip命令
在使用 zip 跟 unzip 命令之前先查看系统有没有安装这两个命令的包,没有的话要自己安装 查看有没有安装zip跟unzip命令的命令:
rpm -q zip unzip
如果安装了,则会显示出命令的版本号
2.2.1 zip命令
基本用法:
1 | zip [参数] [压缩包名] [压缩的目录或者文件的路径] |
示例: 1
>zip -r xgb_pipeline.zip xgb_pipeline
zip命令常用参数
参数 | 描述 |
---|---|
-m | 将文件压缩后,删除原文件 |
-o | 将压缩文件内的所有文件的最新变动时间设为压缩的时间 |
-q | 安静模式,在压缩的时候不显示指令执行的过程 |
-r | 递归压缩,将自定目录下的所有子文件以及文件一起处理 |
-x | ”文件列表“,压缩时排除文件列表中的文件 |
实例
2.2.2 unzip命令
直接使用:
1 | unzip xxx.zip |
便可解压到当前目录下。
基本用法:
1 | unzip [参数] [压缩文件] (-d [目录]) //如果不使用括号内的内容,则解压文件到当前工作目录 |
unzip命令常用参数
参数 | 描述 |
---|---|
-c | 将解压缩的结果显示到屏幕上(显示每一个目录下的每一个文件的内容),同时对字符做适当的转换,但是并没有解压压缩包 |
-l | 显示压缩文件内所包含的文件 |
-t | 检查压缩文件是否正确 |
-v | 执行时显示压缩文件的详细信息 |
-q | 安静模式,执行时不显示任何信息 |
-d | 指定文件解压后存储的目录 |
-x | 指定不要处理压缩文件中的那些文件 |
实例
a.将harry.zip压缩包解压缩的结果显示出来:
具体会显示到每一个文件跟每一个文件的内容
b.显示jihe.zip压缩包里面所包含的文件
c.检查dajihe.zip压缩文件是否正确
全部OK表示全部文件都是正确的
d.不解压压缩文件dajihe.zip,查看压缩包里面的内容(查看显示的文件列表还包含压缩比率)
使用-v
显示的信息比使用-l
显示的信息更加详细
e.将dajihe.zip压缩包解压到/opt/目录下:
注:
1 | unzip -l dajihe.zip |
3.Linux属主权限,chgrp,chown,chmod
可使用 chmod +x 文件名
使文件变为可执行文件,例如:
输入i
进行编辑模式,完成后,按esc
再输入:wq
保存并退出
👆可以看到此时run.sh处于不可执行状态
成功执行
4. shell 命令行参数
参考
http://c.biancheng.net/cpp/view/2739.html
http://blog.csdn.net/jake_tian/article/details/97274630
运行脚本时传递给脚本的参数称为命令行参数。
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,获取第一个参数是$1,获取第二个参数是$2,以此类推 |
$# | 传递给脚本或函数的参数个数 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同 |
$? | 上个命令的退出状态,或函数的返回值。 |
例:脚本如下:
1 | #!/bin/bash |
运行:
1 | $./test.sh Zara Ali |
关于$?
:上条命令的返回值。0表示没有错误,其他任何数值表示有错误。
参考
https://blog.csdn.net/aLLLiyyy/article/details/103184367
https://blog.csdn.net/weixin_39928768/article/details/111582889
例如:如果上条命令执行失败,则重复执行,shell脚本如下:
1 | python test.py |
5. shell 日期加减运算
参考
http://blog.sina.com.cn/s/blog_ad6555610101b5ud.html
https://www.cnblogs.com/zhzhang/p/6846300.html
https://www.cnblogs.com/simple-li/p/14040777.html
http://www.dutycode.com/post-60.html
假如今天是 2012-04-22
1 | $ date -d "+1 day" +%Y-%m-%d |
例:脚本示例:
1 | #!/bin/bash |
例: 按月执行201904到202010的py脚本。
1 | #!/bin/bash |
注:
1 | fi 容易忘记判断结束标记 |
附:数值比较:
-eq
相等(equal)
-ne
不等(not equal)
-gt
大于(greater than)
-lt
小于(less than)
-ge
大于等于 (greater than or equal)
-le
小于等于 (less than or equal)
注:crontab任务调度中,%是个特殊字符,要在前加""进行转义
例:
1 | 0 10 * * * cd /home/zzh && sh test.sh $(date -d "1 day ago" +"\%Y\%m\%d") >/dev/null 2>&1 |
6. shell 变量
定义变量时,变量名不加$
,如:
1 | a=10 |
注:变量名和等号之间不能有空格
使用一个定义过的变量时,在变量名前加 $
,如:
1 | a=10 |
变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界。
已定义的变量,可以被重新定义:
1 | a=10 |
注:第二次赋值的时候不能写成 $a=20
,使用变量时才加
$
7. shell 字符串
7.1 单引号
1 | str='this is a string' |
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字符串中不能出现单独一个的单引号(转义后也不行),但可成对出现,作为字符串拼接使用
7.2 双引号
1 | your_name="runoob" |
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
8. shell 基本运算符
参考 https://www.runoob.com/linux/linux-shell-basic-operators.html
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如expr。expr是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加:
1 | !/bin/bash |
注:表达式和运算符之间要有空格,例如 2+2
是不对的,必须写成 2 + 2
8.1 算数运算符
注:条件表达式要放在方括号之间,并且要有空格,例如:
[$a==$b]
是错误的,必须写成
[ $a == $b ]
。(方括号之间要有空格,运算符和变量之间也要有空格)
8.2 关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
8.3 布尔运算符
8.4 逻辑运算符
8.5 字符串运算符
9. shell 中各种括号的作用
参考
https://www.jb51.net/article/123081.htm
https://www.jianshu.com/p/3e1eaaa3fee8
9.1 单小括号 ()
一般在命令替换的时候使用
1 | !/bin/bash |
9.2 双小括号 (())
使用双括号,在比较过程中使用高级数学表达式
符号 | 描述 |
---|---|
val++ | 后增 |
val-- | 后减 |
++val | 先增 |
--val | 先减 |
! | 逻辑求反 |
~ | 位求反 |
** | 幂操作 |
<< | 左位移 |
>> | 右位移 |
&&逻辑与,||逻辑或
双小括号 (( )) 是 Bash Shell
中专门用来进行整数运算的命令,它的效率很高,写法灵活,是企业运维中常用的运算命令。(())
是一种数学计算命令,它除了可以进行最基本的加减乘除运算,还可以进行大于、小于、等于等关系运算,以及与、或、非逻辑运算。
注:(( )) 只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。
双小括号 (( )) 的语法格式为:
1 | ((表达式)) |
通俗地讲,就是将数学运算表达式放在((
和))
之间。
表达式可以只有一个,也可以有多个,多个表达式之间以逗号,
分隔。对于多个表达式的情况,以最后一个表达式的值作为整个
(( )) 命令的执行结果。
1 | 可以使用 $ 获取 (( )) 命令的结果,这和使用 $ 获得变量值是类似的。 |
在 (( ))
中使用变量无需加上$
前缀,(( ))
会自动解析变量名,这使得代码更加简洁,也符合程序员的书写习惯。
【实例1】利用 (( )) 进行简单的数值计算。
【实例2】利用 (( )) 进行逻辑运算。
运行结果如下:
1 | 可以直接使用if (($i<5)), 如果不使用双括号, 则为if [ $i -lt 5 ]。 |
【实例3】利用 (( )) 进行自增(++)和自减(--)运算。
1 | val=10 |
【实例4】利用 (( )) 同时对多个表达式进行计算。
9.3 单方括号 []
方括号定义了测试条件。第一个方括号 ([
) 后和第二个方括号
(]
)
前都要加一个空格,否则会报错。方括号主要包括4类判断:
(1)数值比较:
1 | if [ $val1 -eq $val2 ] |
(2)字符串比较:
1 | if [ $str1 = $str2 ] |
例:test.sh脚本如下:
运行结果:
经过测试,数值也可以使用=, !=,且对于数值与字符串,=与==效果貌似一样?
运行结果:
(3)文件比较
(4)符合条件比较
1 | [ condition1 ] && [ condition2 ] |
注:[ ]中的 逻辑与 和 逻辑或 使用 -a 和 -o 表示,例:
if [ $a -ne 1 -a $a != 2 ]
,或写作:if [ $a -ne 1 ] && [ $a != 2 ]
9.4 双方括号 [[]]
- 双方括号提供了字符串比较的高级特性
- 括号中可以定义一些正则表达式来匹配字符串
- 注意不是所有的shell都支持双方括号
注:&&、||、< 和 > 操作符能够正常存在于[[
]]条件判断结构中,比如可以直接使用
if [[ $a != 1 && $a != 2 ]]
9.5 例子
1 | if ($i<5) |
10. shell if else 语句
10.1 if 语句
1 | if condition |
如果要将then 和 if 写在一行,要加个分号:
1 | if condition; then |
实例1:下面的例子使用 if 语句来比较两个数字的大小:
实例2:在判断条件中也可以使用逻辑运算符,例如:
10.2 if else 语句
1 | if condition |
10.3 if elif else 语句
1 | if condition1 |
例2:
来自 https://www.tutorialspoint.com/unix/if-elif-statement.htm
11. shell while
参考
http://c.biancheng.net/view/2804.html
https://blog.csdn.net/weixin_44324367/article/details/111312156
shell 之 循环执行某操作 - Simple-Sir - 博客园 (cnblogs.com)
1 | while condition |
while 语句和 if else 语句中的 condition 用法都是一样的,可以使用 test 或 [] 命令,也可以使用 (()) 或 [[]]
【实例1】计算从 1 加到 100 的和。
【实例2】计算从 m 加到 n 的值。
【实例3】输出0~10的所有整数
12. 重定向 >
参考 linux shell中"2>&1"含义 - hongxinerke - 博客园 (cnblogs.com)
1表示标准输出 2表示标准错误 2>&1 的意思就是将标准错误重定向到标准输出
例:
1 | >./test_run.sh >test_run.sh.log 2>&1 |
补充:如何既将结果保存到文件,又输出到屏幕:可使用
tee
,示例如下
1 | >./pythonsql.sh | tee pythonsql.log |
13. crontab 定时执行shell脚本
参考
linux crontab定时执行shell脚本 - 龙昊雪 - 博客园 (cnblogs.com)
linux定时运行命令脚本——crontab_阳光岛主-CSDN博客
crontab命令说明: crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
1 | 语法 |
crontab命令:
1 | crontab -e -> 编辑(进入后,press i 进行编辑,:wq保存并退出) |
crontab文件的含义: 用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
1 | minute hour day month week command |
crontab文件条目的一些例子:
1 | 30 21 * * * /apps/bin/cleanup.sh |
13.1关于路径
关于路径错误,因为在crontab中使用了绝对路径执行脚本,因此在该脚本中引用的其它脚本也都需要使用绝对路径,才能被crontab找到并执行。如何避免绝对路径复杂的设置呢,可采用如下格式:
1 | 0 5 * * * cd /data/test-ml;sh crontab_run.sh >>/data/test-ml/crontab_run.sh.log 2>&1 & |
建议使用此方式,先进入该目录,然后再执行脚本;否则,执行脚本中的其它脚本都需要加绝对路径
13.2 crontab 中传入时间参数
参考 linux内crontab传时间参数_大大盒子的博客-CSDN博客
1 | 15 4 * * * /home/temp/post_analysis/post_analysis_sqoop.sh $(date -d "1 day ago" +"\%Y-\%m-\%d") >/dev/null 2>&1 |
14 Linux shell 管道 |
Shell 有一种功能,就是可以将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成了管道(pipe)。
Linux 管道使用竖线|
连接多个命令,这被称为管道符。Linux
管道的具体语法格式如下:
1 | command1 | command2 |
管道符|
与两侧的命令之间可以存在也可以不存在空格。
当在两个命令之间设置管道时,管道符|
左边命令的输出就变成了右边命令的输入。只要第一个命令向标准输出写入,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道。大部分的
Linux 命令都可以用来形成管道。
使用管道的优点:省去创建临时文件。
【示例】将 ls 命令的输出发送到 grep 命令:
1 | [c.biancheng.net]$ ls | grep log.txt |
上述命令是查看文件 log.txt 是否存在于当前目录下。
我们可以在命令的后面使用选项,例如使用-al
选项:
1 | [c.biancheng.net]$ ls -al | grep log.txt |
我们也可以重定向管道的输出到一个文件(使用重定向操作符>或>>将管道中的最后一个命令的标准输出进行重定向),比如将上述管道命令的输出结果发送到文件 output.txt 中:
1 | [c.biancheng.net]$ ls -al | grep log.txt >output.txt |
15. 在 Linux shell 中查看与处理文件常用的命令
15.1 less
使用管道将 cat 命令的输出作为 less 命令的输入,这样就可以将 cat 命令的输出每次按照一个屏幕的长度显示,这对于查看长度大于一个屏幕的文件内容很有帮助。
1 | cat /var/log/message | less |
15.2 grep
grep 命令用于查找文件里符合条件的字符串。
语法:
1 | grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...] |
【示例1】在当前路径下,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。
1 | grep test *file |
结果如下所示:
1 | >grep test test* #查找前缀有“test”的文件包含“test”字符串的文件 |
【示例2】以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容,使用的命令为:
1 | grep -r update /etc/acpi |
【示例3】查看result.csv中出现100001的行并输出
1 | >cat result.csv | grep 100001 |
将输出结果存入文件:
1 | >cat result.csv | grep 100001 >output.txt |
查找并返回行号:
1 | >cat result.csv | grep -n 100001 |
若想在另一个文件中查看相同行号的内容:
1 | > cat result2.csv | sed -n '334007p' |
15.3 wc
wc命令用于计算字数
语法:
1 | wc [-clw][--help][--version][文件...] |
【示例1】返回行数,字数,字节数
1 | $ cat testfile |
【示例2】查看文件中包含多少个逗号,结合 grep
:
1 | >cat result.txt | grep -o ',' | wc -l |
15.4 sed
sed 可依照脚本的指令来处理、编辑文本文件。
语法:
1 | sed [-hnV][-e<script>][-f<script文件>][文本文件] |
假如有如下文件:
1 | $ cat testfile #查看testfile 中的内容 |
【示例1】列出文件的5到7行:
1 | $ cat testfile | sed -n '5,7p' |
【示例2】搜索 testfile 有 oo 关键字的行:
1 | $ cat testfile | sed -n '/oo/p' |
【示例3】数据的查找与替换:
除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的查找与替换
语法格式如下:
1 | sed 's/要被取代的字串/新的字串/g' |
将 testfile 文件中每行第一次出现的 oo 用字符串 kk 替换,然后将该文件内容输出到标准输出:
1 | >sed -e 's/oo/kk/' testfile |
注:sed 后面接的动作,要以 '...' 两个单引号括住
g
标识符表示全局查找替换,使 sed
对文件中所有符合的字符串都被替换,修改后内容会到标准输出,不会修改原文件:
1 | >sed -e 's/oo/kk/g' testfile |
选项 i
使 sed 修改文件:
1 | >sed -i 's/oo/kk/g' testfile |
批量操作当前目录下以 test 开头的文件:
1 | >sed -i 's/oo/kk/g' ./test* |
【示例4】将文件中的的逗号替换为写入另一个文件:
1 | >cat ./docs/a.txt |sed 's/,/\t/g' >./docs/b.txt |
直接修改原文件:
1 | >sed -i 's/,/\t/g' ./docs/a.txt |
15.5 关于vim
15.5.1 快速清空文件内容
参考 https://blog.csdn.net/qq_21238607/article/details/119541193
1 | #命令模式下 |
👆 注:输入完
d1G
后,会立马清空,不会要求确认等操作。
15.5.2 撤销与恢复
注意,以上这 3 种命令都必须在 Vim 编辑器处于命令模式时才能使用。
15.6 上传与下载文件
- 上传到服务器:
1 | rz |
选择相应的文件即可
- 从服务器上下载文件:
1 | sz text.csv |
选择相应的保存路径即可