应该知道的Linux技巧
这篇文章来源于Quroa的一个问答《What are some time-saving tips that every Linux user should know?》—— Linux用户有哪些应该知道的提高效率的技巧。我觉得挺好的,总结得比较好,把其转过来,并加了一些自己的理解。 首先,我想告诉大家,在Unix/Linux下,最有效率技巧的不是操作图形界面,而是命令行操作,因为命令行意味着自动化。如果你看过《你可能不知道的Shell》以及《28个Unix/Linux的命令行神器》你就会知道Linux有多强大,这个强大完全来自于命令行,于是,就算你不知道怎么去做一个环保主义的程序员,至少他们可以让你少熬点夜,从而有利于你的身体健康和性生活。下面是一个有点长的列表,正如作者所说,你并不需要知道所有的这些东西,但是如果你还在很沉重地在使用Linux的话,这些东西都值得你看一看。 (注:如果你想知道下面涉及到的命令的更多的用法,你一定要man一点。对于一些命令,你可以需要先yum或apt-get来安装一下,如果有什么问题,别忘了Google。如果你要Baidu的话,我仅代表这个地球上所有的生物包括微生物甚至细菌病毒和小强BS你到宇宙毁灭)
基础
- 学习 Bash 。你可以man bash来看看bash的东西,并不复杂也并不长。你用别的shell也行,但是bash是很强大的并且也是系统默认的。(学习zsh或tsch只会让你在很多情况下受到限制)
- 学习 vim 。在Linux下,基本没有什么可与之竞争的编
译辑器(就算你是一个Emacs或Eclipse的重度用户)。你可以看看《简明vim攻略》和 《Vim的冒险游戏》以及《给程序员的Vim速查卡》还有《把Vim变成一个编程的IDE》等等。
- 了解 ssh。明白不需要口令的用户认证(通过ssh-agent, ssh-add),学会用ssh翻墙,用scp而不是ftp传文件,等等。你知道吗?scp 远端的时候,你可以按tab键来查看远端的目录和文件(当然,需要无口令的用户认证),这都是bash的功劳。
- 熟悉bash的作业管理,如: &, Ctrl-Z, Ctrl-C, jobs, fg, bg, kill, 等等。当然,你也要知道Ctrl+\(SIGQUIT)和Ctrl+C (SIGINT)的区别。
- 简单的文件管理 : ls 和 ls -l (你最好知道 “ls -l” 的每一列的意思), less, head, tail 和 tail -f, ln 和 ln -s (你知道明白hard link和soft link的不同和优缺点), chown, chmod, du (如果你想看看磁盘的大小 du -sk *), df, mount。当然,原作者忘了find命令。
- 基础的网络管理: ip 或 ifconfig, dig。当然,原作者还忘了如netstat, ping, traceroute, 等
- 理解正则表达式,还有grep/egrep的各种选项。比如: -o, -A, 和 -B 这些选项是很值得了解的。
- 学习使用 apt-get 和 yum 来查找和安装软件(前者的经典分发包是Ubuntu,后者的经典分发包是Redhat),我还建议你试着从源码编译安装软件。
日常
- 在 bash 里,使用 Ctrl-R 而不是上下光标键来查找历史命令。
- 在 bash里,使用 Ctrl-W 来删除最后一个单词,使用 Ctrl-U 来删除一行。请man bash后查找Readline Key Bindings一节来看看bash的默认热键,比如:Alt-. 把上一次命令的最后一个参数打出来,而Alt-* 则列出你可以输入的命令。
- 回到上一次的工作目录: cd – (回到home是 cd ~)
- 使用 xargs。这是一个很强大的命令。你可以使用-L来限定有多少个命令,也可以用-P来指定并行的进程数。如果你不知道你的命令会变成什么样,你可以使用xargs echo来看看会是什么样。当然, -I{} 也很好用。示例:
find . -name \*.py | xargs grep some_function cat hosts | xargs -I{} ssh root@{} hostname
- pstree -p 可以帮你显示进程树。(读过我的那篇《一个fork的面试题》的人应该都不陌生)
- 使用 pgrep 和 pkill 来找到或是kill 某个名字的进程。 (-f 选项很有用).
- 了解可以发给进程的信号。例如:要挂起一个进程,使用 kill -STOP [pid]. 使用 man 7 signal 来查看各种信号,使用kill -l 来查看数字和信号的对应表
- 使用 nohup 或 disown 如果你要让某个进程运行在后台。
- 使用netstat -lntp来看看有侦听在网络某端口的进程。当然,也可以使用 lsof。
- 在bash的脚本中,你可以使用 set -x 来debug输出。使用 set -e 来当有错误发生的时候abort执行。考虑使用 set -o pipefail 来限制错误。还可以使用trap来截获信号(如截获ctrl+c)。
- 在bash 脚本中,subshells (写在圆括号里的) 是一个很方便的方式来组合一些命令。一个常用的例子是临时地到另一个目录中,例如:
# do something in current dir (cd /some/other/dir; other-command) # continue in original dir
- 在 bash 中,注意那里有很多的变量展开。如:检查一个变量是否存在: ${name:?error message}。如果一个bash的脚本需要一个参数,也许就是这样一个表达式 input_file=${1:?usage: $0 input_file}。一个计算表达式: i=$(( (i + 1) % 5 ))。一个序列: {1..10}。 截断一个字符串: ${var%suffix} 和 ${var#prefix}。 示例: if var=foo.pdf, then echo ${var%.pdf}.txt prints “foo.txt”.
- 通过 <(some command) 可以把某命令当成一个文件。示例:比较一个本地文件和远程文件 /etc/hosts: diff /etc/hosts <(ssh somehost cat /etc/hosts)
- 了解什么叫 “here documents” ,就是诸如 cat <<EOF 这样的东西。
- 在 bash中,使用重定向到标准输出和标准错误。如: some-command >logfile 2>&1。另外,要确认某命令没有把某个打开了的文件句柄重定向给标准输入,最佳实践是加上 “</dev/null”,把/dev/null重定向到标准输入。
- 使用 man ascii 来查看 ASCII 表。
- 在远端的 ssh 会话里,使用 screen 或 dtach 来保存你的会话。(参看《28个Unix/Linux的命令行神器》)
- 要来debug Web,试试curl 和 curl -I 或是 wget 。我觉得debug Web的利器是firebug,curl和wget是用来抓网页的,呵呵。
- 把 HTML 转成文本: lynx -dump -stdin
- 如果你要处理XML,使用 xmlstarlet
- 对于 Amazon S3, s3cmd 是一个很方便的命令(还有点不成熟)
- 在 ssh中,知道怎么来使用ssh隧道。通过 -L or -D (还有-R) ,翻墙神器。
- 你还可以对你的ssh 做点优化。比如,.ssh/config 包含着一些配置:避免链接被丢弃,链接新的host时不需要确认,转发认证,以前使用压缩(如果你要使用scp传文件):
TCPKeepAlive=yes ServerAliveInterval=15 ServerAliveCountMax=6 StrictHostKeyChecking=no Compression=yes ForwardAgent=yes
- 如果你有输了个命令行,但是你改变注意了,但你又不想删除它,因为你要在历史命令中找到它,但你也不想执行它。那么,你可以按下 Alt-# ,于是这个命令关就被加了一个#字符,于是就被注释掉了。
数据处理
- 了解 sort 和 uniq 命令 (包括 uniq 的 -u 和 -d 选项).
- 了解用 cut, paste, 和 join 命令来操作文本文件。很多人忘了在cut前使用join。
- 如果你知道怎么用sort/uniq来做集合交集、并集、差集能很大地促进你的工作效率。假设有两个文本文件a和b已解被 uniq了,那么,用sort/uniq会是最快的方式,无论这两个文件有多大(sort不会被内存所限,你甚至可以使用-T选项,如果你的/tmp目录很小)
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)的执行性能慢N多倍(注:就算是你用UTF-8编码文本文件,你也可以很安全地使用ASCII来对其排序)。如果你想Disable那个i18n 并使用传统的基于byte的排序方法,那就设置export LC_ALL=C (实际上,你可以把其放在 .bashrc)。如果这设置这个变量,你的sort命令很有可能会是错的。
- 了解 awk 和 sed,并用他们来做一些简单的数据修改操作。例如:求第三列的数字之和: awk ‘{ x += $3 } END { print x }’。这可能会比Python快3倍,并比Python的代码少三倍。
- 使用 shuf 来打乱一个文件中的行或是选择文件中一个随机的行。
- 了解sort命令的选项。了解key是什么(-t和-k)。具体说来,你可以使用-k1,1来对第一列排序,-k1来对全行排序。
- Stable sort (sort -s) 会很有用。例如:如果你要想对两例排序,先是以第二列,然后再以第一列,那么你可以这样: sort -k1,1 | sort -s -k2,2
- 我们知道,在bash命令行下,Tab键是用来做目录文件自动完成的事的。但是如果你想输入一个Tab字符(比如:你想在sort -t选项后输入<tab>字符),你可以先按Ctrl-V,然后再按Tab键,就可以输入<tab>字符了。当然,你也可以使用$’\t’。
- 如果你想查看二进制文件,你可以使用hd命令(在CentOS下是hexdump命令),如果你想编译二进制文件,你可以使用bvi命令(http://bvi.sourceforge.net/ 墙)
- 另外,对于二进制文件,你可以使用strings(配合grep等)来查看二进制中的文本。
- 对于文本文件转码,你可以试一下 iconv。或是试试更强的 uconv 命令(这个命令支持更高级的Unicode编码)
- 如果你要分隔一个大文件,你可以使用split命令(split by size)和csplit命令(split by a pattern)。
系统调试
- 如果你想知道磁盘、CPU、或网络状态,你可以使用 iostat, netstat, top (或更好的 htop), 还有 dstat 命令。你可以很快地知道你的系统发生了什么事。关于这方面的命令,还有iftop, iotop等(参看《28个Unix/Linux的命令行神器》)
- 要了解内存的状态,你可以使用free和vmstat命令。具体来说,你需要注意 “cached” 的值,这个值是Linux内核占用的内存。还有free的值。
- Java 系统监控有一个小的技巧是,你可以使用kill -3 <pid> 发一个SIGQUIT的信号给JVM,可以把堆栈信息(包括垃圾回收的信息)dump到stderr/logs。
- 使用 mtr 会比使用 traceroute 要更容易定位一个网络问题。
- 如果你要找到哪个socket或进程在使用网络带宽,你可以使用 iftop 或 nethogs。
- Apache的一个叫 ab 的工具是一个很有用的,用quick-and-dirty的方式来测试网站服务器的性能负载的工作。如果你需要更为复杂的测试,你可以试试 siege。
- 如果你要抓网络包的话,试试 wireshark 或 tshark。
- 了解 strace 和 ltrace。这两个命令可以让你查看进程的系统调用,这有助于你分析进程的hang在哪了,怎么crash和failed的。你还可以用其来做性能profile,使用 -c 选项,你可以使用-p选项来attach上任意一个进程。
- 了解用ldd命令来检查相关的动态链接库。注意:ldd的安全问题
- 使用gdb来调试一个正在运行的进程或分析core dump文件。参看我写的《GDB中应该知道的几个调试方法》
- 学会到 /proc 目录中查看信息。这是一个Linux内核运行时记录的整个操作系统的运行统计和信息,比如: /proc/cpuinfo, /proc/xxx/cwd, /proc/xxx/exe, /proc/xxx/fd/, /proc/xxx/smaps.
- 如果你调试某个东西为什么出错时,sar命令会有用。它可以让你看看 CPU, 内存, 网络, 等的统计信息。
- 使用 dmesg 来查看一些硬件或驱动程序的信息或问题。
作者最后加了一个免责声明:Disclaimer: Just because you can do something in bash, doesn’t necessarily mean you should. ;) (全文完)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《应该知道的Linux技巧》的相关评论
赞一个,很多东西的确是工作中经常用的。不过目前来说我更偏向于用Python来做系统管理,这样可以省得去记一些比较复杂的Bash语法。
好东西~已经添加本博订阅了。无论如何,我都加了您的友情链接了,方便访问,哈哈哈~
是“我谨代表”。
赞一个,!btw:“学习 vim 。在Linux下,基本没有什么可与之竞争的编译器”,“编译器”大丈夫吗?
要系统的看完一个bash的书,基本命令都应该会了。目前正在看《linux shell编程从入门到精通 》
@airekans
请问下python做系统管理跟bash比有什么优势
编译器是不是应该改为编辑器?
虽然总有人发这些东西,不过这些东西就是应该总被时不时翻出来普及下
总结是linux有助于身体健康和性生活。。。亮瞎了
推荐一个命令, 基础的网络管理 中的ip 工具包中包含ss, 可以完美代替netstat.
用bash无可厚非,但是看bash的资料很容易让你在那些无聊不标准的bash addition对新人很不好。建议看ksh的书,用zsh。bash比zsh限制少?语法混乱不等于限制少,bash这货,还是留给root自己玩吧。我个人交互用zsh天花乱坠,工作代码谨尊ksh语法保证通用性。
@一刀
同求, 最近也在找比Bash 更给力的工具, 现在偶尔会在脚本里调第3 方的应用, POST 一下JSON的数据, Bash 脚本处理这些东东感觉很麻烦.
现在RHEL系统中的Yum、system-config-network-tui 这些工具和Xend的服务脚本. 还有N多系统工具有Python的开发包, 为什么还会有那么多Ruby 的系统管理工具?
下面是 http://devopsanywhere.blogspot.com/2011/09/how-ruby-is-beating-python-in-battle.html 这篇文章中列出来用Ruby和Python 开发的和系统管理相关项目
Off-hand here is a non-definitive list of sysadmin/devops related projects in ruby:
[1] puppet
[2] chef
[2] vagrant
[3] mcollective
[4] cucumber (behavior-driven testing)
[5] capistrano
[6] rake (ruby Make)
[7] aeolus project/openshift
[8] cloud foundry
[9] graylog2
[10] logstash
[11] travis-ci
and in Python:
[1] openstack
[2] cobbler
[3] fabric
[4] func
[5] buildbot
ruby 里面这一堆,除了 cap 和 rake,其他几乎没用过,cap 现在也基本上快淘汰了,因为 docker + bash 已经替代它了。
Ubuntu下按住Win键几秒中,有惊喜 (*^__^*) 嘻嘻……
虽然很多都已经知道了,但还是赞这种分享精神。
不知道为什么pstree在我这里输出会有很多乱码,个人比较喜欢用 ps -aux –forest , 这看的不止是tree,而是forest啊,哈哈哈! 如果嫌进程显示不够长,再加上3个www就好了: ps -auxwww –forest
是呀,用着用着就全都会了
lunix学的不多,但很吸引力,我想学啊。
先拼对英文再学不迟
Sublime Text 2 也不错
vim 是编辑器
“Alt-. 把上一次命令的最后一个参数打出来,而Alt-* 则列出你可以输入的命令。”
“Alt-.” 这个命令 怎么用?
Sublime Text 2 拳打 emacs 脚踢 vim
(sublime_text:7200): Gtk-WARNING **: cannot open display:
:D
@badcow
好难看……我还是乖乖用我的 htop 去 :-)
文章说的是Linux命令,有些人看到vim就搬出Sublime Text 2,一看就知道是小白。
几乎所有的Linux发行版,vim是内置命令之一,通过终端即可运行,Sublime Text 2是哪门子的命令?
举个例子,说起命令 ls,难道你就会想起 Windows 的文件管理器?如果真是这样,我只能说,I 服了 You!
看来,我所谓的Linux学的不错还是差太多太多了!!
Vim 是个牛逼而影响广泛的编辑器, 很多项目都有为了讨好 vim 专门写的语法高亮.
没怎么用过vim,一直用emacs,自从emacs24以后有了package管理器以后更喜欢用了。
另外自从我用过emacs的daemon模式以后,就再也没用过screen和tmux
哈,我从一开始用 emacs 就是 daemon 模式。
貌似暴露了我用 emacs 的年头,好吧,我是 emacs 23 刚出来才开始用的。
@hanfei sun
emacs 的 daemon 模式和 screen/tmux 有什么关系么?(是嫌 emacs 启动慢么?还是它的终端版不支持多 window/buffer/tab?)
都是一些常用的东东
为什么`lynx -dump`后面还要跟上-stdin?直接`lynx -dump http://google.com`不就可以了吗?
vim没有竞争,不是很同意。
我先用gvim很久,后来用了emacs, 发现emacs更顺手,功能更强大。
Ctrl-U 是删除此行*光标之前*的内容吧。
假如”[]”为光标位置:
“`
find . -name \*.py | xargs [] grep some_function
“`
此时按下Ctrl-U会变成
“`
grep some_function
“`
所以,我觉得所有情况都可用的删除一行的快捷键是`\C-a\C-k`。
@jlake
vim是默认的?vi才是默认的吧,vim需要自己安装
看来皓哥换工作了心情不错嘛,行文都幽默了,哈哈!
@Terry
如何替代?比如看监听端口
呵呵,我每天的工作几乎都和LINUX打交道,习惯了命令行,在GUI界面下操作反而觉得别扭。。。
vi是编辑器。bash里面的行快捷键其实和EMACS中的快捷键都是一样的,用习惯了emacs的人,在bash下的几个快捷会很亲切。vim是非常强大的编辑器,但如果说没有对手?这个有点夸张了。
平时用得最多的是ls tar find / -name xxx tail -f scp screen,但遇到特殊情况时就得上网去查了。
尝试了好多次学习bash,但工作中用的不多实在是记不住,都是直接用Python来写脚本了……
如果能写一篇bash的原理分析就好了
命令行容易被程序控制,gui容易被人操作,各有优劣。
个人倾向为命令行做对应的gui,把常用的选项、配置由gui简单下拉就能组成命令行参数发出,用户根本不用记任何参数及组合了。
另外,gui也不一定是图形的,ide(文本模式的集成界面)也一样好用(只是最低分辨率不是像素而是字符而已),经典如:mc。
在win里,我也是把涉及底层的工作(RSA算法、IC读写、串口/usb访问。。。)由c编译为命令行exe,由delphi写的gui来调用:取两者的优点!
linux在桌面普及率始终远远低于win,其实原因就在这里。
IT人不能独享清高,独乐乐不如众乐乐
作者的逻辑是:
linux–>命令行(shell)–>bash,
所以bash的技巧就是linux的技巧。我不同意这种看法。试对上面两个箭头(–>)进行反驳:
一、“你就会知道Linux有多强大,这个强大完全来自于命令行”
————————————————————————-
首先,Linux的强大不完全来自于命令行。可以从很多方面评价一个操作系统的好坏,比如性能,安全性,硬件兼容性等等;如果Linux在这些方面很差的话,光有个bash,也强大不起来。
其次,命令行也不是只让Linux更强大。这片文章中的提到的很多技巧,很多非Linux用户,比如FreeBSD用户也一样可以用,但是这些技巧却被冠名为“Linux技巧”,听起来好像是“天不生Linux,万古长如夜”一般。而事实上,bash年纪比Linux大。
二、“你用别的shell也行,但是bash是很强大的并且也是系统默认的。(学习zsh或tsch只会让你在很多情况下受到限制)”
我要说的是,命令行(shell)也不光是bash。当然这主要是个人口味问题。我不知道作者说bash很强大是指交互能力还是指脚本能力。如果是前者,其实各个shell都差不多,甚至有不少人认为bash的交互能力不如某些shell。如果是后者,复杂的任务我是能不用shell编程就不用的,宁愿用p字系的;简单的任务还是那句话,其实各个shell都差不多。
按照作者的逻辑,我也可以说:做为PC用户的你,用别的操作系统也行,但是Windows是很强大的并且也是很多品牌机/软件/(IE only)网站默认的。(学习Linux或BSD只会让你在很多情况下受到限制,比如进不了某某网银,玩不了某某游戏)。
@AntiLinuxism
shell 的交互能力的话,不管怎么看 bash 只能好过 (t)csh,无论 zsh 还是 fish 都比 bash 的交互要好。
复杂任务用 shell 的话就是这样子——https://github.com/clvv/fasd/blob/master/fasd :D
支持原创
(学习Linux或BSD只会让你在很多情况下受到限制,比如进不了某某网银,玩不了某某游戏)
笑。。。。。。
@AntiLinuxism 不得不说,你这个回复真的是在抬扛。你所谓的“作者的逻辑”并不是真的从作者嘴里说出来的,你上述所谓的“作者的逻辑”只是你猜测、猜想的某种延伸意思(人家是不是有这个意思,那就不得而知了),而你还对这个延伸意思进行了一番“反驳”;如果你只是在你自己脑子里这么想想,倒也无妨,不关别人的事,可是你却偏要在这里对你的“猜想与反驳”进行了一番莫名其妙的陈述(因为你没办法证明你所谓的“作者的逻辑”就真的是作者的逻辑),所以你的回复显得多少有些空中楼阁、莫名其妙,左手打右手,只是为了过嘴瘾罢了。
所以我也笑:“你用别的shell也行,但是bash是很强大的并且也是系统默认的。(学习zsh或tsch只会让你在很多情况下受到限制)
@地精
这篇文章命中注定要被人抬杠。你没有发现作者的语气很冲么,很有舍我其谁的霸气,试摘录如下:
对不起我又引用了这句,bash宗在赤裸裸的鄙视其他shell异端
vim宗在赤裸裸的鄙视emacs异端
你觉得我的回复莫名其妙,是因为你没有中枪而且觉得没有人会中枪。
我是为那些中了枪的沉默的一小撮而发了这个回复的,包括但不限于:
1.在Linux下不用bash也不用vim也能活得很轻松的
2…
3…
4.不用Linux但是用bash也用vim也能活得很轻松的
5…
6…
其实作者发的文章都还不错的,但是这种“歧视异端”的口气让我受不了。
而且我觉得这篇文章的取名为“Linux用户应该知道的技巧”比“应该知道的Linux技巧”要恰当。因为后者给人一个误解,以为文章中介绍的技巧都是Linux专有的。
我觉得 bash 的评价还算客观吧? 你整天用 zsh,部署时,你总不能都升级一遍吧,毕竟,发布版都是 bash 默认,(Ubuntu 的 dash 不了解,貌似也是 bash),而且 bash 用好久了,至少我没觉得要用其他 shell 的必要。
至于原作者对于 Vim 的评价……