每一个Linux用户都应该了解的命令行省时技巧

每一个Linux用户都应该了解的命令行省时技巧

本文由 伯乐在线 - 高磊 翻译自 Joshua Levy。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。


伯乐在线导读:有网友在问答网站Quora上提问:“有哪些省时小技巧,是每一个Linux用户都应该知道的?” Joshua Levy 日常就在 Linux 平台工做,而且他积累了很多实用命令行技巧,他在回复中精选出一部分。对技术用户来讲,这些技巧挺重要或实用,但知道的人并很少。下文略有点长,通常来讲,用户也不须要对所有内容都了解,但为了达到省时方便的目的,Joshua Levy  仍竭尽全力作了校对,以保证列出的每一条都值得一读,前提是你是一位Linux重度用户。java

为了获取文中提到的一个命令的更多信息,先试下“man <命令名称>”,在一些状况下,为了让这条命令能够正常执行,你必须安装相应的包,能够用aptitude 或者 yum。若是失败了,求助Google。python

基础篇

  • 学习基础的Bash。事实上,读整个的bash的帮助手册;很容易理解并且篇幅也不算长。其余一些可选的shell外观可能更漂亮,可是bash功能很强大并且老是能用(主要学习zsh或者tcsh在不少状况下你会收到限制)。linux

  • 学习vim,对于Linux下的随机编辑,几乎没有工具能出其右(即便你大部分的时间里都在使用Emacs或者Eclipse)。ios

  • 了解ssh,以及跳过每次登录时密码验证的基础办法,经过ssh-agent,ssh-add等命令。web

  • 熟悉bash下的工做管理: &,Ctrl-Z,Ctrl-C,jobs,fg,bg,kill, 等等。正则表达式

  • 基础的文件管理:ls 以及 ls -l (特别的,学习”ls -l”中列出的每一列字段的含义),less,head,tail,tail -f,ln,ln -s (学习软连接和硬连接的区别),chown,chmod,du(快速了解磁盘整体占用状况),df,mount。shell

  • 基础的网络管理命令:ip 或者 ifconfig,dig。apache

  • 了解正则表达式,以及grep、egrep的不一样命令选项,-0,-A,-B 都值得了解一下。vim

  • 学习使用apt-get 或者 yum(取决于你的发行包)来找到并安装你须要的包.缓存

平常使用篇

  • 使用bash时,用Ctrl-R来搜索命令的历史记录。

  • 使用bash时,用Ctrl-W来清除最后一个单词,使用Ctrl-U来清除整行。能够查看man readline来获取bash里面默认键的绑定设置。内容不少。好比Alt-.(注:点)遍历以前命令中使用过的参数,Alt-* 扩展了参数的匹配模式。

  • 回到上次的工做目录:cd -。

  • 若是你的命令敲到一半时改变了主意,能够用Alt-#来在命令前面增长一个#,使之成为一行注释(或者使用Ctrl-A回到命令开头,而后再键入#)。你能够以后再经过搜索历史记录回来。

  • 使用xargs(或者parallel)。它很是强大。注意你能控制每一行(-L)执行多少项,也能控制如何并发(- P)。若是你不太肯定它会如你所愿的工做,先使用xargs。 再者,-l{} 颇有用。例如:

1
2
find . -name \*.py | xargs grep some_function
cat hosts | xargs -l{} ssh root@{} hostname
  • pstree -p 能够很方便的显示整个进程树。

  • 使用pgrep 和pkill 来经过名字来发现进程或者给进程发信号(-f选项会有用)。

  • 了解你能向进程发送的信号种类。好比,要挂起一个进程,使用kill -STOP [进程ID]。要了解整个列表,请参考man 7 signal。

  • 若是你想让一个后台进程一直运行,使用nohup or disown 。

  • 经过netstat -lntp 来检测哪些进程在监听。一样能够用lsof。

  • bash脚本中,使用set -x 来调试输出。使用set -e在有错误时终止时终止执行。要想严格输出错误,能够考虑使用set -o pipefail(虽然这个主题提及来有些复杂)。对于更复杂的脚本,也可使用trap。

  • bash脚本中,子shell(经过写在括号里)是一种组织命令的方便的方法。一个很常见的例子是暂时移动到另一个工做目录,例如:

1
2
3
#在当前目录下作一些事情
cd /一些/另外的/目录;执行别的操做)
#继续在原来的目录下执行
  • 要注意bash中有不少种变量表达式。检查一个变量是否存在:${name:?错误信息}。例如:若是一个bash脚本须要一个单变量,只须要写input_file=${1:?usage: $0 inpute_file}。数值扩展:i=$({(i+1)%5})。序列:{1..10}。字符串的整理:${var%suffix} 和${var#prefix}。例如:

    1
    if var==foo.pdf, then echo ${var%.pdf}.txt   #会打印"foo.txt"。


  • 经过 <(其余指令),一条命令的输出能够被看成是一个文件的内容来对待。 例如,比较本地和远程的 /etc/hosts 文件,能够用diff /etc/hosts <(ssh [远程主机] cat /etc/hosts)。

  • 了解bash中的“here documents”,好比 cat <<EOF …

  • bash中,经过 其余指令 > 日志文件 2>&1  把标准输出以及标准错误重定向。常见的状况是,为了保证一条指令没有为标准输入留下一个打开的文件描述符,从而输出至你当前所在的终端,增长“</dev/null” 也是好的习惯。

  • 用man ascii能够获得一个完整的ASCII表,有对应的16进制和10进制的值。

  • 经过ssh链接远程终端时,使用screen或者dtach 来保持你的session,防止被打断。在ssh中,了解如何使用-L或者-D选项(有时也会用到-R)会颇有用处,好比,若是经过从一个远程的服务器访问一个网页。

  • 优化你的SSH选项也可能管用。好比,下面的.ssh/config 内容在一些网络环境下能够防止链接掉线,当链接到新主机时不须要再次确认,跳转验证,而且还使用了压缩(对在一些低宽带的链接环境下使用scp时会有帮助)。

1
2
3
4
5
6
TCPKeepAlive= yes
ServerAliveInterval=15
ServerAliveCountMax=6
StrictHostKeyChecking=no
Compression= yes
ForwardAgent= yes

数据处理篇

  • 把HTML转成文本:lynx -dump 标准输入

  • 若是要处理XML,xmlstarlet会很棒。

  • 对于Amazon S3,s3cmd 很方便(虽然还不太成熟,可能会有一些不太好的特性)。

  • 了解sort 以及 uniq(包括uniq的 -u 以及 -d 选项)。

  • 了解cut,paste,join 来操做文本文件。许多人使用cut但却忘了还有join。

  • 当你要在文件之间作集合的加,减,以及差运算时,用sort/uniq是很是方便的。假如a和b是两个已经去重的文本文件,那么运算起来会很快,并且能够在任意大小的文件之间执行操做,甚至能够到GB字节大小。(sort不受内存限制,不过若是/tmp 在一个很小的root分区的话,你可能须要使用-T选项)

1
2
3
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
  • 了解本地化会影响到许多命令行的工做,包括排序的顺序和性能。多数的linux安装包会把LANG或者其余一些本地化的变量设置为相似美国英语的一个本地设置。这会让sort和其余一些命令运行起来慢不少。(注意即便你使用UTF-8编码的文本,你仍然能够放心的经过ASCII码的顺序来排序,这一点用处不少)为避免i18n拖慢平常的工做,使用传统的基于字节的排序顺序,使用export LC_ALL=C(实际上,考虑在你的.bashrc里加进去)。

  • 了解基本的AWK和sed命令来作简单的数据处理。例如:对一个文本文件的第三列的数字求和:awk ‘{x += $3} END {print x}’。 这大概比同等的python速度要×××倍而且代码长度也会简短3倍。

  • 就地替换一个字符串在全部文件里全部出现的地方。

1
perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
  • 使用shuf来随机打乱一个文件中的行或者选择一个随机的行。

  • 了解sort的各个选项。知道键值是如何工做的。特别是,当你要使用 -k1时,要格外注意:1只对第一个字段排序,-k1则意味着根据整个行排序。

  • 稳定排序(sort  -s)可能会有用。例如,先根据第二个字段排序,再根据第一个字段排序时,你可使用sort -k1,1 | sort -s -k2,2

  • 若是你须要在bash里的命令行里写入一个tab键的字面值的话,按Ctrl+V, <tab> 或者$‘\t’ (后者更好,由于你能够复制、粘贴)。

  • 对于二进制文件,使用hd来进行简单的导出16进制表示或者用bvi进行二进制的编辑。

  • 对于二进制文件,strings(还有grep等等)可让你发现文件的字节位(0101).要对文件转编,能够试下iconv,或者若是要使用更高级的用法,试试uconv,它能够支持一些高级的Unicode方面的事情。好比,这条命令能够将重音都小写,而且去掉(经过扩展而且丢掉):

1
uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt
  • 要将文件切片,能够试试split(根据大小切分)或者csplit(根据模式切分)。

系统调试篇

  • 对于web调试来讲,curl和curl -l会有用,以及和wget相同的那部分功能。

  • 若是想了解磁盘/cpu/网络的状态,可使用iostat,netstat,top(更好一些的话,用htop),以及(尤为是)dstat,对于想快速了解系统当前正在发生的事情,很是的方便。若是想了解内存当前的状态,可使用free以及vmstat,还要了解各项输出的含义。特别值得一提的是,你要知道“cached”的数值是linux内核保留用来作文件缓存的空间的大小,因此真正可用的有效内存是“free”项的对应值。

  • java的系统调试则彻底是另一回事,但在Sun以及其余的JVM上有一个简单的技巧,就是你能够运行kill -3 <pid> ,获得一个完整的栈调用轨迹以及堆使用的整体状况(包括产生的垃圾回收细节,这里面包含有不少的信息),会被定向到标准错误或者日志。

  • 使用mtr做为更好的网络追踪,识别网络存在的问题。

  • 要查看一个磁盘是不是满的,ncdu要比通常用的“du -sk *”要快。

  • 要查看哪些socket或者进程在占用带宽,试试iftop或者netlogs。

  • ab 工具(随apache的安装包一块儿发布)对于检测网络服务器的性能颇有帮助,对于更加复杂的压力测试,能够试下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,内存,网络的统计信息。

  • 对于更深层次的系统性能优化,能够关注下stap(systemtap)或者perf。

  • 当出现了一些很诡异的问题时,能够试下dmesg(好比硬件或者驱动的问题)。




原文连接: Joshua Levy   翻译: 伯乐在线 - 高磊
译文连接: http://blog.jobbole.com/54425/
[ 转载必须在正文中标注并保留原文连接、译文连接和译者等信息。]