Linux 快捷命令学习
Introduction
Linux
对于开发人员来讲,是一款必学的操作系统。且现服务器端基本都是部署于Linux
;常见的有Red Hat
、CentOS
、Ubuntu
……
熟悉Linux
系统下诸多命令的常用用法,在服务器端进行生产时,将会事半功倍;往往一个简单的操作,可以使用很多自己熟悉的方式进行实现;Python
、Perl
、R
可能都可以实现,但是在Linux
操作系统下,其配套的shell
不会更香吗?Shell
一行代码能解决的事情,Python
却要一个脚本,怎么想都差点意思。
这里主要是记录一些常用的文本处理涉及到的
shell
命令。
Getting started
可惜的是没有对各种命令进行整理,后续有时间可以归纳分类一下。
1. find
1.1 查找某个目录下的某个文件
1 | find ./ -name "**" |
1.2 对查找得到的文件进行某项操作
后面的
占位符{}
用来表示 find 到的文件名。
1 | find dir -exec cmd {} \; ## 每 find 到一个文件就会执行一次 cmd 命令 |
1.3 按创建时间,修改时间查找文件
1 | find dir -ctime -7 -amin -30 |
1.4 -exec 的花样使用
使用了一段时间的 find -exec 参数,就会发现,参数 -exec 只能支持linux系统的原生终端命令;一些通过alias改写的快捷命令并不能使用,且还不支持管道符 |
当我们需要对查找到的文件路径进行复杂操作时,-exec的用法就有点鸡肋了;于是我们能不能通过占位符 ‘{}’ 来进行传参并通过管道符 ‘|’ 来完成一系列的操作呢???
1 | ## 首先,必须了解的另一种用法 |
2. du
2.1 查询当前目录下文件的大小
1 | du -h --max-depth=1 |
2.2 计算文件大小,单位 Mb
1 | du -sm test.fq.gz ## 以 Mb 为单位输出文件 test.fq.gz 的文件大小 |
3. grep
3.1 匹配多个字符
1 | grep "ins\|del" annot.xls ## 打印出含有 ins 或 del 字符的行 |
3.2 只匹配整个单词
1 | grep -w on ddd.txt ## 这只会匹配完整单词 on,而不会匹配含有 on 的单词,如不会匹配 only |
3.3 同时匹配多个字符
1 | grep -E "EML4.*ALK" ddd.txt ## 打印出同时含有 EML4 和 ALK 的行 |
3.4 去除空行
1 | grep -v '^$' ddd.txt ## 打印除了空行以外的所有 |
3.5 取匹配的前3行
1 | grep -B 3 str xxx.txt |
3.6 取匹配的后3行
1 | grep -A 3 str xxx.txt |
3.7 取匹配的前后3行
1 | grep -C 3 str xxx.txt |
4. sed
4.1 替换前 n 个字符
1 | sed 's/^.\{15\}//g' ddd.txt ## 替换前 15 个字符 |
4.2 替换某一行
1 | sed '1c str' ddd.txt ## 替换文件 ddd.txt 的第一行为 "str" |
4.3 删除某一行
1 | sed '1d' ddd.txt ## 删除文件 ddd.txt 的di |
4.4 某一行前插入一行
1 | sed -i "1i##charu" ddd.txt ## 在文件 ddd.txt 的第一行插入 ##charu |
4.5 替换换行符\n
正常情况下,
sed
并不能替换\n
, 需要额外添加参数那
sed
为什么不能直接替换换行符\n
呢?原因在于
sed
是逐行处理替换操作的,且在每进行一次替换之后,都会在行尾自动添加trailing newline
,即行的分隔符,即换行符,于是常规的替换是无法将换行符替换成其他分隔符的;于是,我们可以对每两行或以上的行进行换行符的替换,这样中间的换行符就能被替换,而最后的换行符保留。
1 | sed ":a;N;s/\n/|/g;ta" ddd.txt ## 替换 ddd.txt 文件的换行符为 | |
在利用 sed
替换换行符 \n
时,上面的命令有点复杂,故这里做个说明:
- 首先提供一个通用写法:
sed ":label;N;s/\n/|/g;t label"
; orsed ":label;N;s/\n/|/g;b label"
:label;
— 这是一个标签,用来实现跳转处理,名字可任意取,如上上面的:label
就是a
;只不过需要注意的就是,前后的label
值需要保持一致N;
— 是sed
的一个处理命令,追加文本流中的下一行到模式空间进行合并处理,也就以换行符\n
分隔(我是这么理解的),这样sed
替换的时候就可以识别到\n
字符,从而实现替换;t
— 即test
,测试的意思,与label
搭配使用,实现跳转处理,跳转到指定的标签处;b
— 即branch
,分支的意思,功能同;t
;只不过是所代表的含义不同;branch
是循环到文本结束;而test
可以根据替换命令的完成是否成功来决定是否跳转
4.6 替换每一行第一个匹配值
1 | sed 's/dd/aa/' a.txt |
4.7 替换第一行的第一个匹配值
当我们只需要替换匹配到的第一个匹配值时,就不能用
4.6
的方法了,因为这会将每一行的第一个匹配值进行替换,于是有了下面的方法
1 | # 【0,/待替换内容/s/待替换内容/替换内容/】 |
4.8 删除匹配行
查找匹配含有特定字符的行,并删除
1 | sed '/str/d' aaa.txt |
1 | # 待整理 |
5. bc
bc 命令是任意精度计算器语言,通常在 Linux 下当计算器使用;类似基本的计算器,使用这个计算器可以做基本的数学运算
==采用
expr
计算数值或者字符串长度,获取更加合适==
==参数介绍==
- -i:强制进入交互模式
- -l:定义使用的标准数学库
- -w:对 POSIX bc 的扩展给出警告信息
- -q:不打印正常的 GNU bc 环境信息
- -v:显示指令版本信息
- -h:显示指令的帮助信息
5.1 通过管道符进行计算
1 | echo "scale=2; 3066/1024"| bc ## scale 用来设定小数位 |
5.2 进行其他进制的计算
1 | echo "ibase=2; 111" | bc ## ibase 用来指定进制 |
5.3 进制转换
1 | !/bin/bash |
5.4 计算平方与平方根
1 | echo "10^10" | bc |
6. Sort
1 | sort -k1 aaa.txt ## 对文件 aaa.txt 的第一列进行重排;默认是升序(以 ASCII 码的次序进行排列) |
7. 查询后台任务的运行绝对路径
通常我们通过
ps
或top
命令来查看后台任务的部分信息,却查不到进程的详细信息,比如运行进程的绝对路径
等,top
命令可以使用c
来查看运行时投递的具体信息,但也没有运行进程所在的绝对路径
此外,我们需要知道的是 Linux
在启动一个进程时,系统会在 /proc
目录下创建一个以 PID
命名的文件夹,在该目录下会有我们创建进程的详细信息,其中:
cwd
:链接的是进程运行目录exe
:链接的是执行程序的绝对路径cmdline
:程序运行时输入的命令environ
:记录了进程运行时的环境变量fd
:目录下为进程打开或使用的文件的符号链接
8. 获取操作系统名称
1 | uname -s |
8.1 获取所有用户的登录情况
1 | who -uH |
9. ps
获取后台任务的详细信息
1 | ps -ef | grep $yourname ## 查询指定用户的所有后台任务 |
==注意==
- 后台任务的信息查询便捷命令
- 首先获得后台任务的
[PID]
pwdx [PID]
— 获取对应进程的运行路径pgrep [进程名]
— 这命令可以列出对应进程名的所有进程id -[PID]
,
- 首先获得后台任务的
10. top
查询系统的详细信息,如内存,CPU,IO等
==如上==
- 第一行(
top -
):系统当前时间up
系统到目前为止运行的时间,
当前登录系统的用户数量(users
),load average:
后面的 3 个数字分别标识距离现在 1min、5min、15min 的负载情况 — 这行的信息与命令uptime
的输出结果一致 - 第二行(
Tasks:
):Tasks
表示任务(进程),total
表示总进程数,running
正在运行,sleeping
休眠(挂起)的任务数量,stopped
任务状态为暂停的数量,zombie
表示僵尸进程的数量 - 第三行(
%Cpu(s):
):表示CPU
的状态,us(user)
用户空间占用cpu的百分比;sy(system)
内核空间占用cpu的百分比;ni(niced)
改变过优先级的进程占用cpu的百分比;id
空闲CPU百分比;wa(IO wait)
IO 等待占用cpu的百分比;hi(hardware IO)
硬中断占用cpu的百分比;si(software interrupts)
软中断占用cpu的百分比 - 第四行(
KiB Mem:
):内存状态,依次为物理内存总量,空闲内存总量,使用中的内存总量,缓冲内存量 - 第五行(
KiB Swap:
):swap 交换分区,依次为交换区总量,空闲交换区总量,使用中的交换区总量,可用交换区总量
(对于内存监控,在 top 里,我们要时刻关注 swap 交换分区中的 used,如果这个数值在不同的变换,说明内核在不断进行内存和交换区的数据交换,预示着内存不够用
)
- 第六行:空行
- 第七行:各进程的监控
PID
:进程 idUSER
:进程所有者PR
:进程优先级NI
:nice值,负值表示高优先级,正值表示低优先级VIRT
:进程使用的虚拟内存总量,单位 kb;${VIRT = SWAP + RES}$RES
:进程使用的、未被换出的物理内存大小,单位 kb;${RES = CODE + DATA}$SHR
:共享内存大小,单位 kbS
:进程状态;D
- 不可中断的休眠状态;R
- 运行;S
- 休眠;T
- 跟踪/停止;Z
- 僵尸进程%CPU
:上次更新到现在的cpu占用百分比%MEM
:进程使用的物理内存百分比TIME+
:进程所用的cpu时间总计,单位 0.01 秒COMMAND
:进程名称(top
命令运行中,键入c
,可以显示进程的详细信息)
11. watch
检测一些重复的操作,
-n
参数指定间隔多长时间重新运行某个命令
1 | watch --differences=permanent -n10 [cmd] |
12. xargs
这是个功能非常强大的命令,可以将标准输出作为参数传入某个命令中运行;特别是对于不能接收标准输入为参数的命令;如 echo(不能接受管道传递的标准输出为参数)
Link: https://ruanyifeng.com/blog/2019/08/xargs-tutorial.html
12.1 将标准输出通过管道符传递给某个命令作为参数运行
1 | # echo 便是一个不能将标准输出通过管道符作为参数进入下一个命令的命令 |
说明 xargs 的功能,便是为那些不能从管道符获取参数的命令服务的;但是 xargs 开发初衷是为 find 服务,所以更多便捷的使用,都可以从 find 中找到
12.2 默认分隔符
【
-d
】xargs 默认的分隔符是换行符和空格,从而将标准输入分隔成多个参数进行读取;同时也支持-d
参数指定分隔符
1 | echo -e "hello\tworld" | xargs -d '\t' echo |
12.3 打印最终执行的命令
【
-p | -t
】当我们不知道参数是否传递正确的情况下,可以通过这两个参数来确认;-t
参数便是将接下来需要执行的命令打印并输出标准输出结果;-p
参数则是在-t
的基础上增加了一个询问功能,打印执行命令之后,会有一个yes or no
的选择,需要用户键入y or n
,大小写无所谓,来确认是否执行该命令;这种参数在设置敏感数据删除rm
的情况下非常重要,防止命令参数的传入失误导致数据误删。
1 | echo -e "hello\tworld" | xargs -d '\t' -t echo |
12.4 指定传入几行数据传入参数
【
-L
】若标准输入包含多行,-L
参数指定多少行作为一个命令行参数
1 | xargs -L 1 find -name |
12.5 指定传入几列数据作为参数
【
-n
】作用与-L
类似,但是其是横向选定,在用户同一行键入多项时,需要利用-n
参数指定每次传入多少项,作为命令行参数
1 | xargs -t -n 1 find -name |
12.6 将命令行参数传递给多个命令
【
-I
】前面默认的都是在xargs
后面的命令后直接添加参数,但是当我们需要向多个命令传递参数时,就需要用到-I
参数,指定需要传递的参数
-I
指定每一项命令行参数的替代字符串
-i
同-I
,只不过是默认以占位符{}
代替变量
1 | echo -e "one\ntwo\nthree" | xargs -I num sh -c 'echo num; echo --num--' |
12.7 多进程执行命令
【
--max-procs
】xargs 命令默认只用一个进程执行命令,只有当执行结束上一个命令,才能执行下一个命令;当需要循环执行命令,且相互之间没有依赖关系的情况下,各个循环可独立运行,故这里可以采用参数--max-procs
命令指定调用的进程数,从而实现同时进行 n 次命令执行;
--max-procs
参数指定同时调用多少个进行并执行命令;
--max-procs 2
– 表示同时最多调用两个进程
--max-procs 0
– 表示不限制进程数
1 | docker ps -q | xargs -n 1 --max-procs 0 docker kill |
12.8 xargs
与 find
的搭伙
【
-0
】xargs
默认是将空格作为分隔符,在处理文件名时,若文件名中存在空格,则不会太方便;
find
命令有个特别的参数-print0
,指定输出的文件列表以null
分隔,而xargs
的-0
参数表示用null
当作分隔符
1 | find /path -type f -print0 | xargs -0 rm |
还有一个原因,使得xargs
特别适合find
命令。有些命令(比如rm
)一旦参数过多会报错”参数列表过长”,而无法执行,改用xargs
就没有这个问题,因为它对每个参数执行一次命令。
1 | find . -name "*.txt" | xargs grep "abc" |
12.9 xargs
与 sed
搭配
1 | echo -e "MSFVAGVIRRLDETVVNRIAAGEVIQRPANAIKEMIENCLDAKSTSIQVIVKEGGLKLIQIQDNGTGIRKEDLDIVCERFTTSKLQSFEDLASISTYGFRGEALASISHVAHVTITTKTADGKCAYRASYSDGKLKAPPKPCAGNQGTQITVEDLFYNIATRRKALKNPSEEYGKILEVVGRYSVHNAGISFSVKKQGETVADVRTLPNASTVDNIRSIFGNAVSRELIEIGCEDKTLAFKMNGYISNANYSVKKCIFLLFINHRLVESTSLRKAIETVYAAYLPKNTHPFLYLSLEISPQNVDVNVHPTKHEVHFLHEESILERVQQHIESKLIAMTNT*" | sed "s/.\{10\}/& /g" | xargs -d ' ' -n 6 echo -e |
13. jobs
查看当前环境的后台任务
1 | jobs -l ## 同时查看后台任务的 PID 号 |
14. ping
待整理
15. 用户输入传参
当我们需要通过用户输入进行传参,这里有两种可选方案:read 和 xargs
15.1 read - 是常规用到的,通过用户键入字符读取参数
。。。。。【待整理】
15.2 xargs - 其单独使用的情况下,默认是 echo
的效果;
1 | xargs find -name |
16. tr
用户转换或删除给定字符串中的某个字符
1 | cat a.txt | tr [:lower:] [:upper:] |
17. printf
printf
作用同echo
,但可以有更多花样可以玩;这还得多多尝试比如,当我们需要输出打印
n
个相同字符时,总不能自己数数吧???当然是通过一定的语法来输出,如下:
1 | printf %.s"-" {1..100} |
18. jq
一个轻量级的命令行 JSON 处理器
link1:https://linux.cmsblogs.cn/c/jq.html
link2:https://cloud.tencent.com/developer/article/1614025
link3:https://www.cnblogs.com/kevingrace/p/7565371.html
19. toilet && figlet
一对在
Linux
终端整花活的难兄难弟。
1 | echo "$(date '+%D %T' | toilet -f term -F border --gay)" |
20. loginctl
返回当前登录情况
1 | loginctl list-sessions |
21. eval
了解指定的参数在一起成为一个单一的可执行命令
对后面的命令进行两次扫描;简单来说就是对输出的变量进行执行,具体看下面的示例
1 | test='echo "hello"' |
22. set
set
命令可显示打印出当前用户所设置的所有变量名与对应的值