Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)

时间:2015-10-25 20:52:14   收藏:0   阅读:1139
著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者:孙立伟 链接:http://www.zhihu.com/question/20140085/answer/14107336 来源:知乎
这个问题quora上有人提过 What are some lesser known but useful Unix commands? ,已经有不少答案了,我个人已经从这些答案中学到不少,这里我只是照搬过来,然后加上自己的解释。
  1. lsof: 列出所有打开的文件。举例:‘lsof -p 456,123‘ 列出进程456和123所有打开的文件。‘lsof -i 6‘ 列出所有IPv6协议的网络文件。
  2. nl: 将输出的每一行加上行号。例如:‘cat 1.txt | nl‘,输出1.txt的文件并加上行号
  3. CTRL+aCTRL+e: 到命令行首(ctrl+a)和行末(ctrl+e),在小键盘上特别有用,不用费心思找HOME和END键
  4. ALT+.:列出上一个命令的最后一个参数。这个命令我最常用。例如‘mkdir mydir‘,然后‘cd ALT+.‘。很好用
  5. CTRL+R: 这个也很常用,搜索命令历史相当方便。
  6. grep/sed/cut/tr/: 这几个命令的组合能够很方便的解析很多文件,就不一一举例了。个人不常用awk,觉得‘sed‘就够用了。
  7. find/xargs: 这个我也很常用,在一堆文件中查找某个特定字符串。这个常常和6中列出命令组合使用。
  8. ls -d */: 这个命令仅列出当前目录下所有的一级子目录,不包括‘.‘开头的隐藏目录,如果想列出隐藏目录,使用‘ls -d .*‘。‘find -type d -maxdepth 1‘也有类似的效果。
  9. id: 列出本用户所属的所有用户组。
  10. Brace Expansion:已经有人说过了,我补充完整一点。"ls /usr/{,local}/bin",列出"/usr/bin"和"/usr/local/bin"下所有文件。这个机制称为"Brace Expansion",再举个例子:"diff    .bashrc{,.backup}",显示.bashrc和.bashrc.backup两个文件之间的差异。
  11. column: 也有人提过,放在这里算总结吧,一个常用的语法是‘mount | column -t‘,或者 ‘df | column -t‘,让输出更加容易阅读。
  12. ssh/sshfs/scp: 善用ssh相关工具让你的远程工作起来更加方便。‘ssh -X‘打开X-forward功能。‘ssh-keygen‘和‘ssh-copy-id‘让你省去每次输入密码的麻烦。ssh root@10.1.1.1 “远程命令"让你的命令远程执行。‘sshfs root@10.1.1.1:/var/ /home/root/var‘ 将远程目录直接mount到本地目录。"scp root@10.1.1.1:.vimrc ."将远程服务器中root用户HOME目录下的.vimrc文件拷贝到本地。
  13. 使用‘<‘号读取文件到标准输入:对于所有接受标准输入的命令,使用‘<文件名‘可以将某个文件送入标准输入,并且可以出现在命令的任何位置,例如:
        "cat filename"
        "<filename cat"
        "cat <filename"
        上面三个命令的效果是一模一样的。
----更新----- 这里补充说明一下,上面的几个技巧中所有命令行编辑的快捷键(CTRL+r CTR+a, CTRL+e)是由GNU readline库定义的,‘man readline‘可以得到更详细的说明以及更多的快捷键定义。但是由于和你使用的TERMINAL类型可能发生各种冲突,所以不是所有的快捷键都能够很好的工作。
-----更新2--- 类似问题的链接 有哪些不常见但很有用处的 Unix 命令?
-----更新3---- Top Ten One-Liners from CommandLineFu Explained 上面这篇文章总结了不少有用的命令。这个链接是四篇文章组成的一个系列,值得一看。
另外,readline的模式问题,BASH缺省的是emac模式(set -o emacs),通过‘set -o vi‘可以切换到vi模式,同一个网站上也有两篇很好的文章介绍操作技巧,值得一看。 BASH VI 模式 Working Productively in Bash‘s Vi Command Line Editing Mode (with Cheat Sheet) BASH EMAC 模式 Bash Emacs Editing Mode Cheat Sheet
---更新4---- 碰巧看见All commands上有一个使用lsof的实用技巧(Keep a copy of the raw Youtube FLV,MP4,etc stored in /tmp/),借这个地方记录一下:
现在浏览器的flash插件在播放在线视频的时候,常常将下载的视频放在/tmp目录下,然后执行unlink删除文件,但实际上文件并没有删除,这些被unlink的文件其实可以通过/proc找到。通过lsof找出插件的进程号,然后在/proc/插件进程号/fd/下找到当前打开文件的链接,然后就可以直接拷贝出来,在我的ArchLinux下firefox是这样的:
首先保证firefox正在播放flash视频,例如打开youku,随便播放一个视频,按暂停,执行下面的步骤:
  1. lsof -n -P | grep FlashXX:输出当前flash插件打开的所有文件,例如:"plugin-co 30427 30428 dsun   15u      REG               0,17  8790980     163285 /tmp/FlashXXRxAIDF (deleted)"
  2. 30427即flash插件进程号,执行‘ls -l /proc/30427/fd/ | grep /tmp/FlashXXRxAIDF‘,输出 "lrwx------ 1 dsun dsun 64 Mar 27 13:31 15-> /tmp/FlashXXRxAIDF (deleted)"
  3. 拷贝文件:‘cp /proc/30427/fd/15 15.flv‘。
不过,根据上面commandlinfu中的另一个说法,可以直接这样做:
for h in `find /proc/*/fd -ilname "/tmp/Flash*" 2>/dev/null`; do cp $h `basename $h`.flv; done
---更新5----
又看到一个我之前不知道的用法,用backslash执行命令,可以取消alias的效果.
\ (backslash)
The backslash escape character can be used before a shell command to override any aliases.
For example if rm was made into an alias for rm -i then typing “rm” would actually run rm -i.
However, typing \rm lets the shell ignore the alias and just run rm (its runs exactly what you type), this way it won‘t confirm if you want to delete things.

技术分享

刑天战士程序员

Startar Sun知乎用户、知乎用户
等人赞同
nc,可以在没有ssh的情况下传输文件,配合tar真心好用

技术分享

知乎用户,修电脑

linux GUN知乎用户、知乎用户
等人赞同
Ubuntu里面有个sl命令,如果输入ls手快了输成sl就会提示apt-get install sl,装完之后运行一下就会出现一个小火车,挺有意思的。
Shell没有range函数,可以使用 {1..999} 的形式,或seq命令。seq的选项不多,但是设计的非常精致和强大,man seq查看手册,1分钟内可以掌握它。
find xxx -print0 xargs -0 或 xargs --null 如果你被find和xargs坑过,-print0和--null你定会让你感到亲切的。
read -a 将读取到的元素存入数组 或在循环里逐个地存入数组:
musics=()
while read -r -d $‘\0‘; do
    musics+=("$REPLY")
done <     <(find $HOME/Music -type f -print0)
上例中的 -r 和 -d 选项以及REPLY变量都很有趣。
引号,很容易被忽略,但是对于Shell来说是极其重要的部分。单引号用于阻止Shell解释其中的内容,双引号用于保护空格。
传统的UNIX管道模式是“一个输入,一个输出”。用函数的观点来看就是只允许一个参数的函数调用,其弊端王垠也提到过。不过现代的Shell已经有了变通的方法了。 例如: 使awk获取多个输入:
awk ‘...‘ <(generate_data) <(another_generate_data) ...
将数据传给多个命令处理:
generate_data | tee >(sort | uniq > sorted_data) >(nl > with_line_number) > raw_data
变量$-: [ "$-" = "*i*" ] 可以判断是否以交互式运行程序
变量$_: 类似于Python交互式环境中的 _(下划线),但没有你想象的好用。
内建命令trap: 可以捕捉信号,Google+上有人贴过使用trap恶搞的脚本,不过它的正式用处应该是清理临时文件,例如:
trap ‘rm -f $temp_file‘ EXIT
!1003 #执行history里的第1003行命令 !ll #执行上一个命令  或者!-1 !?dongwm#查找历史记录里面包含‘dongwm’最近的那个命令执行 ^str1^str2^  #使用^ str1的替换字符串^ str2 ^ !str:^  #获取命令str的第一个参数 !str:$  #获取命令str的最后一个参数 !str:n  #获取命令str的第n个参数 !str:n-m  #获取命令str的第n-m的参数 !$ #获取上一个命令的最后一个参数

技术分享

猫小喵求求你让我秀个优越感

JesseChen题叶
赞同
这里有个网页总结得也蛮好的,一些不常用但很好用的unix命令/工具:

技术分享

Tuxify故书不厌百回读

知乎用户、Suuuch刘浩骅
等人赞同
1. 以 sudo 运行上条命令:
$ sudo !!
2. 在以普通用户打开的 VIM 当中保存一个 ROOT 用户文件:
:w !sudo tee %
3. 切换回上一个目录:
$ cd -
4. 替换上一条命令中的一个短语(仅替换第一个):
$ ^foo^bar^
5. 快速备份一个文件:
$ cp filename{,.bak}
引自: Top Ten One-Liners from CommandLineFu Explained

技术分享

牛杰阿里云专家、资深域名行业从业者、技术工…

知乎用户
赞同
whoami
  • 很酷
  • 很冷门
  • 很少用
  • 很有用-这个。。。自己判断吧

技术分享

Sah Lee不上进

庄俊锋袁力Tuxify
赞同
Ctrl - R 不错。
李润泽匿名用户
赞同
1. cloc技术分享2. highlight, 把它弄成 function/alias。如果目标是所支持的后缀就使用 ccat, 其它如 pipeline 就使用 scat。技术分享 3. unp,不确定算不算冷门,但很多传统教学都教 tar, 所以 linux 小白可能不懂。

技术分享

知乎用户,搬机狂徒

 
sdcv命令行版本的翻译软件。 festival命令行版本的文字转语音。 fbterm支持中文的字符界面。 yong输入法,字符界面下的中文输入法。 mplayer,支持字符界面的视频播放器。 aria2c,命令行下的下载软件,支持迅雷。 有了以上大法,你知道,意味着什么?

技术分享

李洋移动游戏开发

rm -rf / 这个算是很酷很冷门很少有人用的命令吗?

技术分享

shell von兼职程序员/专职厨师

工作使用的的ubuntu的bash/zsh交替。就我自己而言,因为除却答案排名最高的人之外,看到比如ctrl+a,ctrl+e居然也算入了命令,那么我继续补充其他诸如此类的快捷键。当然,不能补充完全,我只能用到我自己平时在用的。 首先,对于楼上提到的这些快捷方式的冷门:
  • ctr+a回到首->你记忆成a是字母开始
  • ctr+e回到末->e是end的意思。
  • ctr+r历史命令检索->research.[ctrl+shift+r也可以试试]
  • 另外还有诸如:
  • ctrl+shift+v,黏贴,这样可以避免很多人使用鼠标右键~
  • ctr+p返回上一条命令->pre
  • ctr+n返回下一条命令->next
  • ctrl+l->类似clear命令的 效果
  • 其他ctr+d/c/z什么的不用提及吧?
以上只是因为上面看到别人的原因,就补充了我平时使用的ctrl开始的快捷键. 接下来一!开始的快捷键
  • 使用 !! 执行上一条命令,常用的时候就是sudo !!
  • 使用 !foo 执行以 foo 开头的命令
  • 使用 !?foo 执行包含 foo 的命令
  • 通过 !$ 得到上一条命令的最后一位参数[Alt +.]
  • !^ 得到上一条命令的第一个参数[Ctrl + Alt + y]
  • 使用 !n 执行第 n 个命令,这个一般是在我ctlr+r没检索到,会用history来看.然后就.
  • 使用 !-n 执行倒数第 n 个命令,同上.
  • 使用 !# 引用当前行,这个我基本不用,但是讲到!了,我就顺便说说.比如cp,mv的时候就容易用到它,mv fuck !#:1.bak 这里的1是一个word specifier.我不常用,因为一般我都直接tab补全的.有兴趣的可以网上看看资料
  • !:[n-m] 得到上一条命令第 n -m个参数.这么说把,当!:N表示你要第n个,当你冒号之后给的是2个数字范围,那么就是去一个范围的参数,当给出!:n*的时候,就是第n个到最后一个,当!*这种就是所有参数.
  • 在!#我提到过word specifier,现在补充比如:!$:h->选取参数的开头部分.这个我也比较常用.
  • 还有:h:e:t等等,自己看吧.写的太多了.
然后是其他使用命令行的技巧:
  • alias这种命令属于常用的.$()和``[反引号]这些,大家都懂撒.
比如我在ubuntu下使用龙井qq的时候因为qq经常异常退出,但是还有进程在,所以我每次都要kill掉,大概我写的就是sudo kill -9 `ps axu|grep qq|grep -v grep |awk ‘{print $2}‘`  里面用到了这个``.
  • 使用^ 删除错误.比如当你执行ls -l 的时候,你输入lsss -l,这时候可以执行^ss,删除2个s,删除是从左边开始寻找然后删除,比如lsds  ->你^s的时候,命令就换成了lds了.
  • 使用 ^old^new 替换. 不解释
至于要说好玩的功能.我推荐google 检索一下Ascii Art 哦.楼上说的什么cowsay,sl,toitlet,tpp这些都是属于此类. 补充: Home · rvoicilas/inotify-tools Wiki · GitHub Asciinema - Record and share your terminal sessions, the right way 这种都好玩呢.
网站推荐的话:explainshell.com
希望大家效率都高起来~恩.

技术分享

mike deng哈哈!

 
make -j8 一个伟大的东西诞生了。

技术分享

知乎用户,Be Nice

huangkunyegle
赞同
strace, 秒杀大部分debug
郅帅杰知乎用户
赞同
bash 中我用得最多的快捷键是 alt+退格,删除最后一个单词;然后是 ctrl+R 找历史
watch : 每隔一段时间监视某个命令的输出 split : 分割文件 comm : 得到两个文件中相同的行 join : 像 sql 的 join 语句一样操作文本 cut : 以某个分隔符提取某一列
参考:

技术分享

find运维, Release Engineer,

strace 用来跟踪程序执行情况,debug的时候很有用。 sed -i 配合find用来修改配置文件极度方便 vimdiff  打开vim看两个文件的不同之处 pstack 这个用来看线程情况 ctrl+z 把当前程序放到后台执行,比如vim的时候,你需要看本级ip就可以执行这个命令,ifconfig后可以再用fg切换回vim的界面,而不用退出vim。 cp /dev/null filename   用来删掉filename文件,而不会影响正在使用这个文件的进程。 暂时这么多了

技术分享

题叶Ubutnu12.04 && Gnome3

知乎用户
赞同
$ pushd .  # 把当前路径压入栈中 $ popd  # 从栈中弹出 思维习惯跟不上.. 有时挺有用的, unix 命令真多到无语了

技术分享

BenMQ新加坡

知乎用户
赞同
$ bc
高精度计算器
 
http://www.zhihu.com/question/20140085
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!