每个Linux用户必知的省时技巧

来源:互联网 发布:知乎 正常感情浓度 编辑:程序博客网 时间:2024/04/23 16:18

转载自:http://pythoner.org/wiki/849/

如果你想对某个命令进行深刻的了解,推荐你输入“man <命令名称>”试验一下。有的时候,你必须安装某个软件包,你可以尝试yum或者aptitude(译者注:在debin以及ubuntu等系统下可以apt-get)。如果仍然不行,只好发动谷歌神功。

基础知识

  • 了解基本的bash。事实上你可以直接读下bash短小精悍,容易理解的手册。当然其他的shell也不错,但是bash是适用范围最广的(如果你对shell的理解主要建立在zsh或者tcsh上,本文所提到的一些东西可能不适合你)。
  • 学习下vim。这基本上是唯一的选择,linux下没有可以与他竞争的随机编辑器( random Linux editing,译者注:这个东西不知道是什么,也不知道怎么翻译,貌似emacs也可以啊……)(即使你大部分时间用emacs或者eclipse)
  • 了解一点ssh,体验过通过ssh-agent和ssh-add进行的密码认证。
  • 熟悉bash的作业(进程)管理,比如: &, Ctrl-Z, Ctrl-C, jobs, fg, bg, kill等等
  • 了解基础的文件相关命令如:ls和ls -l(特别要理解“ls -l”命令结果中每一列的意义),less,head,tail和tail -f,ln和ln -s(明白软连接和硬链接的区别),chown,chomod,du(用于形成硬盘使用状况的摘要,如“du -sk *”),df,mount
  • 了解基础网络管理命令:ip或者ifconfig,dig
  • 比较熟悉正则表达式,grep和egrep的各种标志,其中-o,-A还有-B这几个选项非常有用
  • 能使用apt-get或者yum(发行版)安装软件包

日常使用中

  • 在bash中,使用Ctrl-R查找输入过的命令历史。
  • 在bash中,使用Ctrl-W删除此处到左边的单词,Ctrl-U删除整行内容,可以man查看默认的bash系统快捷键设置,非常多,例如Alt-,循环先前的命令参数,Alt-*发展一团。
  • 返回当前工作目录:cd -
  • 使用xargs过滤器(或者 parallel)特别有用,可以使你控制多少项目每行(-L),以及类似的(-P),如果你不知道执行的正确与否,可以利用xargs先输出,-I{}是非常方便的,例如:        
find . -name \*.py | xargs grep some_function
cat hosts | xargs -I{} ssh root@{} hostname
  •  pstree是用来帮助显示进程树。
  • 使用pgrep和pkill来查找或给进程发送信号(-f 很有帮助)。
  • 你可以发送给进程各种各样的信号,例如,暂停一个进程,使用kill -STOP[pid],使用man查看7个全部参数.
  • 如果你想让进程在后台运行使用nohup或者disown。
  • 查看进程监听端口通过使用netstat -lntp,lsof也可以。
  • 在bash脚本中,使用set -x 调试输出,使用set -e 终止错误,考虑使用set -o pipefail也行,

要严格的误差(虽然这个话题有点微妙)。更多地脚本,也使用陷阱。

  • 在bash脚本中,subshells(括号)是方便的方式组命令。一个常见的例子是暂时转移到一个不同的目录,例如:
#  在做某事的当前目录
(cd /some/other/dir; other-command)
# 继续在原目录
  • 在bash中,有很多种变量扩展。检查变量存在:$ {name:? error message}。例如,如果一个bash脚本需要一个单一的说法,只是写input_file =${1:?usage:$0 input_file }。算术k扩展:i=$(((i+1)%5))。序列:{ 1....10 }。修剪字符串:${var%suffix}和{vat#prefix}。例如,如果= foo.pdf,然后输出$ {var%.pdf}.txt 打印"foo.txt"。
  • 该命令的输出可以被看作一个文件通过<(一些指令)。例如,比较本地主机与远程之一:差异/主机的<(ssh somehost cat /etc/hosts)
  • 知道查看bash中的文档,如cat <<EOF....

  • 在bash中,重定向标准输出和标准误差通过some-command >日志2&1。通常,确保命令不会离开一个打开的文件句柄标准输入,把它的终端是你,这也是很好的实践加上“< /dev/null”。
  • 使用man ascii是个很好的ASCII的表格,十六进制和十进制值。
  • 远程ssh会话,使用屏幕或dtach保存会话,以免中断。
  • 网络调试,curl,curl-I是得心应手,和/或wget一样。
  • HTML转换到文档:lynx -dump - -stdin
  • 如果你必须处理XML,xmlstarlet非常好。
  • 比如亚马逊的 S3,s3cmd方便使用(虽然目前不大成熟,偶尔也有不合理的地方)。
  • ssh中,知道如何端口隧道 -L 或 -D(偶尔 -R)是有用的,例如访问站点从远程服务器。
  • 一些优化您的ssh配置它可以是有用的,例如,this.ssh/config 包含设置避免丢失连接在一定的网络环境,不需要确认连接到新的主机,提出认证,并使用压缩(这是有用的单片低带宽连接):
TCPKeepAlive=yes
ServerAliveInterval=15
ServerAliveCountMax=6
StrictHostKeyChecking=no
StrictHostKeyChecking=no
ForwardAgent=yes 
  • 如果你中途键入命令改变主意,打Alt-#添加#在开始进入它作为一个注释(或者使用Ctrl -,#,进入)。你可以稍后返回通过命令历史

数据处理

  • 了解sort与uniq(包括uniq的-u与-d选项)。
  • 了解cut、paste和join,以处理文本文件。许多人会用cut却不知道join。
  • 用sort/uniq可以做文本文件的求交集、并集和差集操作,有时候非常好用。

比方说,我们有a和b两个文本文件,已经做过uniq,就可以用sort/uniq来做集合操作。这种方法非常快,而且可以处理很大的文件,上到几个G。(sort不受内存的限制,不过如果/tmp是在一个很小的分区上,那么可能需要加上-T选项。)

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的差集
  • 了解locale对许多命令行工具的影响,包括排序的顺序和性能。大多数Linux的安装过程都会把LANG或其它locale变量设置为本地的值,比如US English。这会让sort和其它一些命令慢上n倍(注意,UTF-8文本即使按ASCII顺序排序也是安全的)。请使用export LC_ALL=C,以禁用缓慢的i18n例程,改用传统的按字节顺序排序(请考虑把它放入.bashrc中)。
  • 了解基本的awk和sed用法。例如,累加文件中第3个字段的数字:awk '{ x += $3 } END { print x }'。这种方法比Python要快3倍,代码也短3倍。
  • 利用shuf从文件中随机选取行。
  • 了解sort的选项。了解关键字如何工作(-t和-k)。特别是注意-k1,1和-k1的区别,前者表示按第1列排序,后者则是按整行来排序。
  • 稳定排序(sort -s)很有用。例如,优先按第2列、其次按第1列排序,可以使用sort -k1,1 | sort -s -k2,2。
  • 如果需要在bash的命令行中输入一个tab(如,sort的-t参数),可以按Ctrl-V<tab>或输入$'\t'(后者比较好,可以拷贝和粘贴)。
  • 对于二进制文件,用hd来进行dump,用bvi来进行修改。
  • 对于二进制文件,用strings(搭配grep)可以查找某些位或文本。
  • 转换文件编码可以用iconv。更复杂的要求可以用uconv(支持某些高级Unicode功能,如transforms for normalization和accent removal等)。
  • 拆分文件可以用split(按大小拆)和csplit(按模式拆)。
系统调试 
  • 想要了解硬盘/CPU/网络状态,使用 iostat、netstat、top(htop更好)和 dstat(推荐)。他们对于迅速了解系统状态很有帮助。
  • 想要了解内存状态,运行 free 和 vmstat 命令,了解它们的输出结果。特别要了解“cached” 值是 Linux 内核作为文件缓存所占用,而“free”值则是可以有效使用的。
  • Java 系统调试也是一种选择, 对于 Sun 公司的或其它的 JVM,有一个小技巧,你可以运行 kill -3命令,完整的栈追踪和堆统计信息(包括非常翔实的分代垃圾回收的详细信息)则会被丢到转储到 stderr/logs 文件中。
  • 使用 mtr 进行路由追踪,来识别网络问题。
  • 想看看那个进程或端口占用带宽?试试 iftop 或 nethogs 命令。
  • Apache 的 ab 工具对迅速查看服务器性能很有帮助。要进行更复杂的加载测试,则使用 siege。
  • 要更完整的网络调试,使用 wireshark 或 tshark 命令。
  • 了解 strace 和 ltrace。当程序故障、挂起或崩溃时,它们很有帮助,你知道么,它们也能羊你大致了解性能信息。注意分析选项(-c),以及绑定到运行中的进程(-p)的能力。
  • 使用 ldd 可以查看共享库的。
  • 使用 gdb 链接进程,并进行栈追踪。
  • 利用 /proc。有的时候,它对调试出现的问题的帮助是惊人的。例如: /proc/cpuinfo、 /proc/xxx/cwd、/proc/xxx/exe、/proc/xxx/fd/、/proc/xxx/smaps。
  • 想要了解过去为什么出错,sar 很有帮助。它能显示CPU,内存,网络等的历史统计
  • 每当有什么行为诡异的事情发生时(可能是硬件或驱动程序问题),使用 dmesg 命令。
  免责声明:您 可以在bash的做一些事情,并不意味着应该去做。