1
</div> </td>
diff /etc/hosts <(ssh somehost cat /etc/hosts) | </tr> </tbody> </table> </div> </div> </div>
- 了解 Bash 中的“here documents”,例如
cat <<EOF ...
。 - 在 Bash 中,同时重定向标准输出和标准错误,
some-command >logfile 2>&1
。通常,为了保证命令不会在标准输入里残留一个打开了的文件句柄导致你当前所在的终端无法操作,添加 </dev/null
是一个好习惯。 - 使用
man ascii
查看具有十六进制和十进制值的ASCII表。man unicode
,man utf-8
,以及 man latin1
有助于你去了解通用的编码信息。 - 使用
screen
或 tmux
来使用多个屏幕,当你在使用 ssh 时(保存 session 信息)将尤为有用。另一个轻量级的解决方案是 dtach
。 - ssh 中,了解如何使用
-L
或 -D
(偶尔需要用 -R
)去开启隧道是非常有用的,例如当你需要从一台远程服务器上访问 web。 - 对 ssh 设置做一些小优化可能是很有用的,例如这个
~/.ssh/config
文件包含了防止特定环境下断开连接、压缩数据、多通道等选项:
1 2 3 4 5 6 7 </div> </td> TCPKeepAlive=yes ServerAliveInterval=15 ServerAliveCountMax=6 Compression=yes ControlMaster auto ControlPath /tmp/%r@%h:%p ControlPersist yes | </tr> </tbody> </table> </div> </div> - 部分其他的关于 ssh 的选项是安全敏感且应当小心启用的。例如在可信任的网络中:
StrictHostKeyChecking=no ,ForwardAgent=yes - 考虑使用
mosh 作为 ssh 的替代品,它使用 UDP 协议。 - 获取文件的八进制格式权限,使用类似如下的代码:
1 </div> </td> stat -c '%A %a %n' /etc/timezone | </tr> </tbody> </table> </div> </div> </div> - 使用
percol 或者 fzf 可以交互式地从另一个命令输出中选取值。 - 使用
fpp (PathPicker)可以与基于另一个命令(例如 git )输出的文件交互。 - 将 web 服务器上当前目录下所有的文件(以及子目录)暴露给你所处网络的所有用户,使用:
python -m SimpleHTTPServer 7777 (使用端口 7777 和 Python 2)或python -m http.server 7777 (使用端口 7777 和 Python 3)。 - 以某种权限执行命令,使用
sudo (root 权限)或sudo -u (其他用户)。使用su 或者sudo bash 来启动一个以对应用户权限运行的 shell。使用su - 模拟其他用户的登录。 文件及数据处理 - 在当前路径下通过文件名定位一个文件,
find . -iname '*something*' (或类似的)。在所有路径下通过文件名查找文件,使用 locate something (但请记住 updatedb 可能没有对最近新建的文件建立索引)。 - 使用
ag 在源代码或数据文件里检索(比 grep -r 更好)。 - 将HTML转为文本:
lynx -dump -stdin - Markdown,HTML,以及所有文档格式之间的转换,试试
pandoc 。 - 如果你不得不处理 XML,
xmlstarlet 宝刀未老。 - 使用
jq 处理 JSON。 - Excel 或 CSV 文件的处理,csvkit 提供了
in2csv ,csvcut ,csvjoin ,csvgrep 等工具。 - 关于 Amazon S3,
s3cmd 很方便而 s4cmd 更快。Amazon 官方的 aws 以及 saws 是其他 AWS 相关工作的基础。 - 了解如何使用
sort 和 uniq ,包括 uniq 的 -u 参数和 -d 参数,详见后文一行代码节。另外可以了解一下 comm 。 - 了解如何使用
cut ,paste 和 join 来更改文件。很多人都会使用 cut ,但几乎都不会使用 join 。 - 了解如何运用
wc 去计算新行数(-l ),字符数(-m ),单词数(-w )以及字节数(-c )。 - 了解如何使用
tee 将标准输入复制到文件甚至标准输出,例如 ls -al | tee file.txt 。 - 了解语言环境对许多命令行工具的微妙影响,包括排序的顺序和性能。大多数 Linux 的安装过程会将
LANG 或其他有关的变量设置为符合本地的设置。意识到当你改变语言环境时,排序的结果可能会改变。明白国际化可能会时 sort 或其他命令运行效率下降许多倍。某些情况下(例如集合运算)你可以放心的使用 export LC_ALL=C 来忽略掉国际化并使用基于字节的顺序。 - 了解
awk 和 sed 关于数据的简单处理的用法。例如,将文本文件中第三列的所有数字求和:awk '{ x += $3 } END { print x }' . 这可能比同等作用的 Python 代码快三倍且代码量少三倍。 - 替换一个或多个文件中出现的字符串:
1 </div> </td> perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt | </tr> </tbody> </table> </div> </div> </div> - 依据某种模式批量重命名多个文件,使用
rename 。对于复杂的重命名规则,repren 或许有帮助。 1 2 3 4 </div> </td> # Recover backup files foo.bak -> foo: rename 's/\.bak$//' *.bak # Full rename of filenames,directories,and contents foo -> bar: repren --full --preserve-case --from foo --to bar . | </tr> </tbody> </table> </div> </div> </div> - 使用
shuf 从一个文件中随机选取多行。 - 了解
sort 的参数。处理数字方面,使用 -n 或者 -h 来处理可读性数字(例如 du -h 的输出)。明白键的工作原理(-t 和 -k )。例如,注意到你需要 -k1,1 来仅按第一个域来排序,而 -k1 意味着按整行排序。稳定排序(sort -s )在某些情况下很有用。例如,以第二个域为主关键字,第一个域为次关键字进行排序,你可以使用 sort -k1,1 | sort -s -k2,2 。 - 如果你想在 Bash 命令行中写 tab 制表符,按下 ctrl-v [Tab] 或键入
$'\t' (后者可能更好,因为你可以复制粘贴它)。 - 标准的源代码对比及合并工具是
diff 和 patch 。使用 diffstat 查看变更总览数据。注意到 diff -r 对整个文件夹有效。使用 diff -r tree1 tree2 | diffstat 查看变更总览数据。 - 对于二进制文件,使用
hd 使其以十六进制显示以及使用 bvi 来编辑二进制。 - 同样对于二进制文件,使用
strings (包括 grep 等等)允许你查找一些文本。 - 二进制文件对比(Delta 压缩),使用
xdelta3 。 - 使用
iconv 更改文本编码。而更高级的用法,可以使用 uconv ,它支持一些高级的 Unicode 功能。例如,这条命令将所有元音字母转为小写并移除了: 1 </div> </td> uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt | </tr> </tbody> </table> </div> </div> </div> - 拆分文件,查看
split (按大小拆分)和 csplit (按模式拆分)。 - 使用
zless ,zmore ,zcat 和 zgrep 对压缩过的文件进行操作。 系统调试 curl 和 curl -I 可以便捷地被应用于 web 调试中,它们的好兄弟 wget 也可以,或者是更潮的 httpie 。 - 使用
iostat 、netstat 、top (htop 更佳)和 dstat 去获取硬盘、cpu 和网络的状态。熟练掌握这些工具可以使你快速的对系统的当前状态有一个大概的认识。 - 使用
netstat 和 ss 查看网络连接的细节。 - 若要对系统有一个深度的总体认识,使用
glances 。它在一个终端窗口中向你提供一些系统级的数据。这对于快速的检查各个子系统非常有帮助。 - 若要了解内存状态,运行并理解
free 和 vmstat 的输出。尤其注意“cached”的值,它指的是 Linux 内核用来作为文件缓存的内存大小,因此它与空闲内存无关。 - Java 系统调试则是一件截然不同的事,一个可以用于 Oracle 的 JVM 或其他 JVM 上的调试的小技巧是你可以运行
kill -3 <pid> 同时一个完整的栈轨迹和堆概述(包括 GC 的细节)会被保存到标准输出/日志文件。JDK 中的jps ,jstat ,jstack ,jmap 很有用。SJK tools 更高级. - 使用
mtr 去跟踪路由,用于确定网络问题。 - 用
ncdu 来查看磁盘使用情况,它比常用的命令,如 du -sh * ,更节省时间。 - 查找正在使用带宽的套接字连接或进程,使用
iftop 或 nethogs 。 ab 工具(捆绑于 Apache)可以简单粗暴地检查 web 服务器的性能。对于更复杂的负载测试,使用 siege 。 wireshark ,tshark 和 ngrep 可用于复杂的网络调试。 - 了解
strace 和 ltrace 。这俩工具在你的程序运行失败、挂起甚至崩溃,而你却不知道为什么或你想对性能有个总体的认识的时候是非常有用的。注意 profile 参数(-c )和附加到一个运行的进程参数 (-p )。 - 了解使用
ldd 来检查共享库。 - 了解如何运用
gdb 连接到一个运行着的进程并获取它的堆栈轨迹。 - 学会使用
/proc 。它在调试正在出现的问题的时候有时会效果惊人。比如:/proc/cpuinfo ,/proc/meminfo ,/proc/cmdline ,/proc/xxx/cwd ,/proc/xxx/exe ,/proc/xxx/fd/ ,/proc/xxx/smaps (这里的 xxx 表示进程的 id 或 pid)。 - 当调试一些之前出现的问题的时候,
sar 非常有用。它展示了 cpu、内存以及网络等的历史数据。 - 关于更深层次的系统分析以及性能分析,看看
stap (SystemTap),perf ,以及sysdig 。 - 查看你当前使用的系统,使用
uname , uname -a (Unix/kernel 信息) 或者 lsb_release -a (Linux 发行版信息)。 - 无论什么东西工作得很欢乐时试试
dmesg (可能是硬件或驱动问题)。 一行代码 一些命令组合的例子: - 当你需要对文本文件做集合交、并、差运算时,结合使用
sort /uniq 很有帮助。假设 a 与 b 是两内容不同的文件。这种方式效率很高,并且在小文件和上G的文件上都能运用 (sort 不被内存大小约束,尽管在 /tmp 在一个小的根分区上时你可能需要 -T 参数),参阅前文中关于 LC_ALL 和 sort 的 -u 参数的部分。 1 2 3 </div> </td> cat a b | sort | uniq > c # c is a union b cat a b | sort | uniq -d > c # c is a intersect b cat a b b | sort | uniq -u > c # c is set difference a - b | </tr> </tbody> </table> </div> </div> </div> - 使用
grep . * 来阅读检查目录下所有文件的内容,例如检查一个充满配置文件的目录比如 /sys 、/proc 、/etc 。 - 计算文本文件第三列中所有数的和(可能比同等作用的 Python 代码快三倍且代码量少三倍):
1 </div> </td> awk '{ x += $3 } END { print x }' myfile | </tr> </tbody> </table> </div> </div> </div> - 如果你想在文件树上查看大小\日期,这可能看起来像递归版的
ls -l 但比 ls -lR 更易于理解: 1 </div> </td> | </tr> </tbody> </table> </div> </div> </div> - 假设你有一个类似于 web 服务器日志文件的文本文件,并且一个确定的值只会出现在某些行上,假设一个
acct_id 参数在URI中。如果你想计算出每个 acct_id 值有多少次请求,使用如下代码: 1 </div> </td> cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn | </tr> </tbody> </table> </div> </div> </div> - 运行这个函数从这篇文档中随机获取一条小技巧(解析 Markdown 文件并抽取项目):
1 2 3 4 5 6 7 </div> </td> 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 } | </tr> </tbody> </table> </div> </div> </div> 冷门但有用 expr :计算表达式或正则匹配 m4 :简单地宏处理器 yes :多次打印字符串 cal :漂亮的日历 env :执行一个命令(脚本文件中很有用) printenv :打印环境变量(调试时或在使用脚本文件时很有用) look :查找以特定字符串开头的单词 cut 、paste 和 join :数据修改 fmt :格式化文本段落 pr :将文本格式化成页/列形式 fold :包裹文本中的几行 column :将文本格式化成多列或表格 expand 和 unexpand :制表符与空格之间转换 nl :添加行号 seq :打印数字 bc :计算器 factor :分解因数 gpg :加密并签名文件 toe :terminfo entries 列表 nc :网络调试及数据传输 socat :套接字代理,与 netcat 类似 slurm :网络可视化 dd :文件或设备间传输数据 file :确定文件类型 tree :以树的形式显示路径和文件,类似于递归的 ls stat :文件信息 time :执行命令,并计算执行时间 lockfile :使文件只能通过 rm -f 移除 logrotate : 切换、压缩以及发送日志文件 watch :重复运行同一个命令,展示结果并高亮有更改的部分 tac :反向输出文件 shuf :文件中随机选取几行 comm :一行一行的比较排序过的文件 pv :监视通过管道的数据 hd ,hexdump ,xxd ,biew 和 bvi :保存或编辑二进制文件 strings :从二进制文件中抽取文本 tr :转换字母 iconv 或 uconv :简易的文件编码 split 和 csplit :分割文件 sponge :在写入前读取所有输入,在读取文件后再向同一文件写入时比较有用,例如 grep -v something some-file | sponge some-file units :将一种计量单位转换为另一种等效的计量单位(参阅 /usr/share/units/definitions.units ) apg :随机生成密码 7z :高比例的文件压缩 ldd :动态库信息 nm :提取 obj 文件中的符号 ab :性能分析 web 服务器 strace :系统调用调试 mtr :更好的网络调试跟踪工具 cssh :可视化的并发 shell rsync :通过 ssh 或本地文件系统同步文件和文件夹 wireshark 和 tshark :抓包和网络调试工具 ngrep :网络层的 grep host 和 dig :DNS 查找 lsof :列出当前系统打开文件的工具以及查看端口信息 dstat :系统状态查看 glances :高层次的多子系统总览 iostat :硬盘使用状态 mpstat : CPU 使用状态 vmstat : 内存使用状态 htop :top 的加强版 last :登入记录 w :查看处于登录状态的用户 id :用户/组 ID 信息 sar :系统历史数据 iftop 或 nethogs :套接字及进程的网络利用 ss :套接字数据 dmesg :引导及系统错误信息 sysctl : 在内核运行时动态地查看和修改内核的运行参数 hdparm :SATA/ATA 磁盘更改及性能分析 lsb_release :Linux 发行版信息 lsblk :列出块设备信息:以树形展示你的磁盘以及磁盘分区信息 lshw ,lscpu ,lspci ,lsusb 和 dmidecode :查看硬件信息,包括 CPU、BIOS、RAID、显卡、USB设备等 lsmod 和 modinfo :列出内核模块,并显示其细节 fortune ,ddate 和 sl :额,这主要取决于你是否认为蒸汽火车和莫名其妙的名人名言是否“有用” 仅限 MacOS X 系统 以下是仅限于 MacOS 系统的技巧 - 用
brew (Homebrew)或者 port (MacPorts)进行包管理。这些可以用来在 Mac 系统上安装以上的大多数命令。 - 用
pbcopy 复制任何命令的输出到桌面应用,用 pbpaste 粘贴输入。 - 在终端中将 Option 键视为 alt 键,Preferences -> Profiles -> Keyboard 勾选上 “Use Option as Meta key”。
- 用
open 或者 open -a /Applications/Whatever.app 使用桌面应用打开文件。 - Spotlight: 用
mdfind 搜索文件,用 mdls 列出元数据(例如照片的 EXIF 信息)。 - 注意 MacOS 系统是基于 BSD UNIX 的,许多命令(例如
ps ,ls ,tail ,awk ,sed )都和 Linux 中有些微的不同,这些极大的被 System V-style Unix 和 GNU 工具影响。你可以通过标题为 “BSD General Commands Manual” 的 man 页面发现这些不同。在有些情况下 GNU 版本的命令也可能被安装(例如 gawk 和 gsed 对应 GNU 中的 awk 和 sed )。如果要写跨平台的 Bash 脚本,避免使用这些命令(例如,考虑 Python 或者 perl )或者经过仔细的测试。 更多资源 文/jlevy 来自: http://www.cricode.com/4094.html
| | | | | | | | | |