命令行艺术
学习基本 Bash 技能。实际上,键入man bash,然后至少浏览一遍所有内容。
至少学好一种基于文本的编辑器。理想的一个是 Vim(vi)。
学习使用 man 来阅读文档。用 apropos 找到帮助页。
学习使用 > 和 < 来进行输出和输入重定向,以及使用 | 来管道重定向,学习关于 stdout 和 stderr 的东西。
学习文件通配扩展和应用,以及双引号 " 和单引号 ' 之间的区别。
熟悉 Bash 作业管理:&, ctrl-z, ctrl-c, jobs, fg, bg, kill 等等。
掌握ssh,以及通过 ssh-agent,ssh-add 等进行无密码验证的基础技能。
基本的文件管理:ls 和 ls -l,less, head, tail 和 tail -f,ln 和 ln -s,chown,chmod,du。
文件系统管理:df,mount,fdiskmkfs,lsblk。
基本的网络管理: ip 或 ifconfig,dig。
熟知正则表达式,以及各种使用grep/egrep的选项。-i,-o,-A 和 -B 选项。
学会使用 apt-get,yum ,dnf 或 pacman来查找并安装软件包。确保可以用pip 来安装基于 Python 的命令行工具。
在Bash中,使用 tab 补完参数,使用 ctrl-r 来搜索命令历史。
在Bash中,使用 ctrl-w 来删除最后的单词,使用 ctrl-u 来删除整行,返回行首。使用 alt-b 和 alt-f 来逐词移动,使用ctrl-k 来清除到行尾的内容,以及使用 ctrl-l 清屏。
喜欢 vi 风格的键盘绑定,可以使用 set -o vi。
要查看最近用过的命令,请使用 history 。 缩写形式,比如 !$(上次的参数)和!!(上次的命令),也可使用 ctrl-r 和 alt-. 。
返回先前的工作目录: cd -
命令输入到一半,但是改变主意了,可以敲 alt-# 来添加一个 # 到开头,然后将该命令作为注释输入(或者使用快捷键 ctrl-a, #,enter 输入)。然后,你可以在后面通过命令历史来回到该命令。
使用 xargs(或 parallel),它很强大。注意,你可以控制每行(-L)执行多少个项目,以及并行执行(-P)。不确定它是否会做正确的事情,可以首先使用 xargs echo。同时,使用 -I{} 也很方便。pstree -p 对于显示进程树很有帮助。
使用 pgrep 和 pkill 来按名称查找进程或给指定名称的进程发送信号。
掌握各种可以发送给进程的信号。例如,要挂起进程,可以使用 kill -STOP [pid]。
想要一个后台进程一直保持运行,使用 nohup 或 disown。
通过 netstat -lntp 或 ss -plat 检查哪些进程在监听。
lsof来查看打开的套接字和文件。
在 Bash 脚本中,使用 set -x 调试脚本输出。尽可能使用严格模式。使用 set -e 在遇到错误时退出。也可以使用set -o pipefail,对错误进行严格处理。对于更复杂的脚本,也可以使用 trap。
在 Bash 脚本中,子 shell是组合命令的便利的方式。
在 Bash 中有大量的各种各样的变量扩展。检查一个变量是否存在:${name:?error message}。
命令的输出可以通过 <(some command) 作为一个文件来处理。了解 Bash 中的“嵌入文档”,就像在 cat <<EOF ... 中。
在 Bash 中,通过:some-command >logfile 2>&1 同时重定向标准输出和标准错误。通常,要确保某个命令不再为标准输入打开文件句柄,而是将它捆绑到你所在的终端,添加 </dev/null 是个不错的做法。
man ascii 可以得到一个不错的ASCII表,带有十六进制和十进制值两种格式。对于常规编码信息,man unicode,man utf-8 和 man latin1 很有帮助。
使用 screen 或 tmux 来复用屏幕,这对于远程 ssh 会话尤为有用,使用它们来分离并重连到会话。另一个只用于保持会话的最小可选方案是 dtach。
在 ssh 中,知道如何使用 -L 或 -D来打开端口通道是很有用的,如从一台远程服务器访问网站时。
为你的 ssh 配置进行优化很有用;例如,这个 ~/.ssh/config 包含了可以避免在特定网络环境中连接被断掉的情况的设置、使用压缩(这对于通过低带宽连接使用 scp 很有用),以及使用一个本地控制文件来开启到同一台服务器的多通道:
TCPKeepAlive=yes
ServerAliveInterval=15
ServerAliveCountMax=6
Compression=yes
ControlMaster auto
ControlPath /tmp/%r@%h:%p
ControlPersist yes
其它一些与 ssh 相关的选项对会影响到安全,请小心开启,如各个子网或主机,或者在信任的网络中:StrictHostKeyChecking=no, ForwardAgent=yes
要获得八进制格式的文件的权限,这对于系统配置很有用而用 ls 又没法查看,而且也很容易搞得一团糟,可以使用像这样的东西:
stat -c '%A %a %n' /etc/timezone
对于从另一个命令的输出结果中交互选择值,可以使用percol。
对于基于另一个命令(如git)输出的文件交互,可以使用fpp 。
为当前目录(及子目录)中的所有文件构建一个简单的 Web 服务器,让网络中的任何人都可以获取,可以使用:python -m SimpleHTTPServer 7777 (使用端口 7777 和 Python 2)。
要在当前目录中按名称定位文件,find . -iname '*something*'。要按名称查找任何地方的文件,使用 locate something。
对于源代码或数据文件进行的常规搜索,使用 ag。
要将 HTML 转成文本:lynx -dump -stdin。
对于 Markdown、HTML,以及各种类型的文档转换,可以试试 pandoc。
如果你必须处理 XML,xmlstarlet 虽然有点老旧,但是很好用。
对于 JSON,使用jq。
对于 Excel 或 CSV 文件,csvkit提供了 in2csv,csvcut,csvjoin,csvgrep 等工具。
对于亚马逊 S3 ,s3cmd会很方便,而s4cmd 则更快速。亚马逊的 aws 则是其它 AWS 相关任务的必备。
掌握 sort 和 uniq,包括 uniq 的 -u 和 -d 选项。
掌握 cut,paste 和 join,它们用于处理文本文件。很多人会使用 cut,但常常忘了 join。
了解 tee,它会将 stdin 同时复制到一个文件和 stdout,如 ls -al | tee file.txt。
了解基本的改动数据的 awk 和 sed 技能。
在一个或多个文件中,替换所有出现在特定地方的某个字符串:
perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
要立即根据某个模式对大量文件重命名,使用 rename。对于复杂的重命名,repren可以帮助你达成。
稳定排序(sort -s)会很有用。例如,要首先按字段2排序,然后再按字段1排序,你可以使用 sort -k1,1 | sort -s -k2,2
如果你曾经需要在 Bash 命令行中写一个水平制表符(如,用于 -t 参数的排序),按ctrl-v [Tab],或者写$'t'(后面的更好,因为你可以复制/粘贴)。
对源代码进行补丁的标准工具是 diff 和 patch。 用 diffstat 来统计 diff 情况。注意 diff -r 可以用于整个目录,所以可以用 diff -r tree1 tree2 | diffstat 来统计(两个目录的)差异。
对于二进制文件,使用 hd 进行简单十六进制转储,以及 bvi 用于二进制编辑。
还是用于二进制文件,strings(加上 grep 等)可以让你找出一点文本。
对于二进制文件的差异(delta 压缩),可以使用 xdelta3。
要转换文本编码,试试 iconv 吧,或者对于更高级的用途使用 uconv;它支持一些高级的 Unicode 的东西。例如,这个命令可以转换为小写并移除所有重音符号(通过扩展和丢弃):
uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt
要将文件分割成几个部分,来看看 split和 csplit。
使用 zless,zmore,zcat 和 zgrep 来操作压缩文件。
Web 调试,curl 和 curl -I 很方便灵活,或者也可以使用它们的同行 wget,或者更现代的 httpie。
了解磁盘、CPU、网络的状态,使用 iostat,netstat,top和dstat。它们对于快速获知系统中发生的状况很好用。
更深层次的系统总览,可以使用 glances。
要了解内存状态,可以运行 free 和 vmstat。要知道“cached”值是Linux内核为文件缓存所占有的内存,因此,要有效地统计“free”值。
Java 系统调试是一件截然不同的事,但是对于 Oracle 系统以及其它一些 JVM 而言,不过是一个简单的小把戏,你可以运行 kill -3 <pid>,然后一个完整的堆栈追踪和内存堆的摘要将被转储到stderr/logs。
使用 mtr 作路由追踪更好,可以识别网络问题。
查看磁盘满载的原因,ncdu 会比常规命令如 du -sh * 更节省时间。
查找占用带宽的套接字和进程,试试 iftop 或 nethogs 吧。
(Apache附带的)ab工具对于临时应急检查网络服务器性能很有帮助。对于更复杂的负载测试,可以试试 siege。
更仔细的网络调试,可以用 wireshark,tshark 或 ngrep。
掌握 strace 和 ltrace。如果某个程序失败、挂起或崩溃,而你又不知道原因,或者如果你想要获得性能的大概信息,这些工具会很有帮助。注意,分析选项(-c)和使用 -p 关联运行进程。
掌握 ldd 来查看共享库等。
使用 gdb 来连接到一个运行着的进程并获取其堆栈追踪信息。
使用 /proc。当调试当前的问题时,它有时候出奇地有帮助。
当调试过去某个东西为何出错时,sar 会非常有帮助。它显示了 CPU、内存、网络等的历史统计数据。
对于更深层的系统和性能分析,看看 stap 和 sysdig 吧。
确认是正在使用的 Linux 发行版版本:lsb_release -a。
每当某个东西的行为异常时,使用dmesg。
有时候通过 sort/uniq 对文本文件做交集、并集和差集运算时,这个例子会相当有帮助。假定 a 和 b 是已经进行了唯一性处理的文本文件。这会很快,而且可以处理任意大小的文件,总计可达数千兆字节。可参见上面关于LC_ALL的注解和 -u 选项(参见下面例子更清晰)。
sh cat a b | sort | uniq > c # c 是 a 和 b 的并集
cat a b | sort | uniq -d > c # c 是 a 和 b 的交集
cat a b b | sort | uniq -u > c # c 是 a 减去 b 的差集
使用 grep . * 来可视化查看一个目录中的所有文件的所有内容,例如,对于放满配置文件的目录: /sys,/proc, /etc。
对某个文本文件的第三列中所有数据进行求和(该例子可能比同等功能的Python要快3倍,而且代码也少于其3倍):
awk '{ x += $3 } END { print x }' myfile
如果想要查看某个文件树的大小/日期,该例子就像一个递归ls -l,但是比ls -lR要更容易读懂:
find . -type f -ls
只要可以,请使用 xargs 或 parallel。注意,你可以控制每行(-L)执行多少个项目,以及并行执行(-P)。如果你不确定它是否会做正确的事情,可以首先使用 xargs echo。同时,使用 -I{} 也很方便。样例:
find . -name '*.py' | xargs grep some_function
cat hosts | xargs -I{} ssh root@{} hostname
比如说,你有一个文本文件,如 Web 服务器的日志,在某些行中出现了某个特定的值,如 URL 中出现的 acct_id 参数。如果你想要统计有多少个 acct_id 的请求:
cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn
运行该函数来获得来自本文的随机提示(解析Markdown并从中提取某个项目):
function taocl() {
curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md |
pandoc -f markdown -t html |
xmlstarlet fo --html --dropdtd |
xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" |
xmlstarlet unesc | fmt -80
}
expr:实施算术或布林操作,或者求正则表达式的值
m4:简单的宏处理器
yes:大量打印一个字符串
cal:漂亮的日历
env:(以特定的环境变量设置)运行一个命令(脚本中很有用)
look:查找以某个字符串开头的英文单词(或文件中的行)
cut 和 paste 以及 join:数据处理
fmt:格式化文本段落
pr:格式化文本为页/列
fold:文本折行
column:格式化文本为列或表
expand 和 unexpand:在制表符和空格间转换
nl:添加行号
seq:打印数字
bc:计算器
factor:分解质因子
gpg:加密并为文件签名
toe:terminfo 条目表
nc:网络调试和数据传输
socat:套接字中继和 tcp 端口转发(类似 netcat)
slurm:网络流量可视化
dd:在文件或设备间移动数据
file:识别文件类型
tree:以树形显示目录及子目录;类似 ls,但是是递归的。
stat:文件信息
tac:逆序打印文件
shuf:从文件中随机选择行
comm:逐行对比分类排序的文件
hd和bvi:转储或编辑二进制文件
strings:从二进制文件提取文本
tr:字符转译或处理
iconv或uconv:文本编码转换
split和csplit:分割文件
units:单位转换和计算;将每双周(fortnigh)一浪(浪,furlong,长度单位,约201米)转换为每瞬(blink)一缇(缇,twip,一种和屏幕无关的长度单位)
7z:高比率文件压缩
ldd:动态库信息
nm:目标文件的符号
ab:Web 服务器基准测试
strace:系统调用调试
mtr:用于网络调试的更好的路由追踪软件
cssh:可视化并发 shell
rsync:通过 SSH 同步文件和文件夹
wireshark 和 tshark:抓包和网络调试
ngrep:从网络层摘取信息
host 和 dig:DNS查询
lsof:处理文件描述符和套接字信息
dstat:有用的系统统计数据
glances:高级,多个子系统概览
iostat:CPU和磁盘使用率统计
htop:top的改进版
last:登录历史
w:谁登录进来了
id:用户/组身份信息
sar:历史系统统计数据
iftop或nethogs:按套接口或进程的网络使用率
ss:套接口统计数据
dmesg:启动和系统错误信息
hdparm:SATA/ATA 磁盘操作/改善性能
lsb_release:Linux 发行版信息
lsblk:列出块设备,以树形展示你的磁盘和分区
lshw:硬件信息
fortune,ddate 和 sl:它取决于你是否认为蒸汽机车和 Zippy 引用“有用”
本文转载自Linux中国原文:https://linux.cn/article-5703-1.html更多详细内容,点击下文【阅读全文】
查看评论 回复