每个Linux用户都应该知道的命令行技巧_搜索

Joshua Levy 平常就在 Linux 平台工作,并且他积累了不少实用命令行技巧,他在回复中精选出一部分。对技术用户来说,这些技巧挺重要或实用,但知道的人并不多。下文略有点长,一般来说,用户也不需要对全部内容都了解,但为了达到省时方便的目的,Joshua Levy 仍不遗余力做了校对,以保证列出的每一条都值得一读,前提是你是一位Linux重度用户。

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

基础篇

1、学习基础的Bash。事实上,读整个的bash的帮助手册;很容易理解而且篇幅也不算长。其他一些可选的shell外观可能更漂亮,但是bash功能很强大而且总是能用(主要学习zsh或者tcsh在很多情况下你会受到限制)。

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

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

3、熟悉bash下的工作管理: &,Ctrl-Z,Ctrl-C,jobs,fg,bg,kill, 等等。

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

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

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

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

日常使用篇

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

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

3、回到上次的工作目录:cd -。

4、如果你的命令敲到一半时改变了主意,可以用Alt-#来在命令前面增加一个#,使之成为一行注释(或者使用Ctrl-A回到命令开头,然后再键入#)。你可以之后再通过搜索历史记录回来。

5、使用xargs(或者parallel)。它非常强大。注意你能控制每一行(-L)执行多少项,也能控制如何并发(- P)。如果你不太确定它会如你所愿的工作,先使用xargs。 再者,-l{} 很有用。例如:

find . -name \*.py | xargs grep some_function
cat hosts | xargs -l{} ssh root@{} hostname

6、pstree -p 可以很方便的显示整个进程树。

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

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

8、如果你想让一个后台进程一直运行,使用nohup or disown 。

9、通过netstat -lntp 来检测哪些进程在监听。同样可以用lsof。

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

数据处理篇

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

2、如果要处理XML,xmlstarlet会很棒。

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

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

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

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

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

7、了解本地化会影响到许多命令行的工作,包括排序的顺序和性能。多数的linux安装包会把LANG或者其他一些本地化的变量设置为类似美国英语的一个本地设置。这会让sort和其他一些命令运行起来慢很多。(注意即使你使用UTF-8编码的文本,你仍然可以放心的通过ASCII码的顺序来排序,这一点用处很多)为避免i18n拖慢日常的工作,使用传统的基于字节的排序顺序,使用export LC_ALL=C(实际上,考虑在你的.bashrc里加进去)。

系统调试篇

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

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

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

4、使用mtr作为更好的网络追踪,识别网络存在的问题。

5、要查看一个磁盘是否是满的,ncdu要比一般用的“du -sk *”要快。

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

6、ab 工具(随apache的安装包一起发布)对于检测网络服务器的性能很有帮助,对于更加复杂的压力测试,可以试下siege。对于更加严重的网络问题的调试,试试wireshark或者tshark。了解strace和ltrace。这在一个程序突然失败,挂掉,或者崩溃,而你却不知所措,或者是你想知道程序的整体性能的情况时,会很有帮助。可以注意下-c和-p选项。

了解用ldd来检查共享库函数等的一些问题。

以上信息对你来说一定是有用的,现在没吸收不要紧,转到朋友圈慢慢看吧!