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? ,已经有不少答案了,我个人已经从这些答案中学到不少,这里我只是照搬过来,然后加上自己的解释。
上面三个命令的效果是一模一样的。
----更新----- 这里补充说明一下,上面的几个技巧中所有命令行编辑的快捷键(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,随便播放一个视频,按暂停,执行下面的步骤:
---更新5----
又看到一个我之前不知道的用法,用backslash执行命令,可以取消alias的效果. http://tldp.org/LDP/GNU-Linux-Tools-Summary/html/general-shell-tips.html
- lsof: 列出所有打开的文件。举例:‘lsof -p 456,123‘ 列出进程456和123所有打开的文件。‘lsof -i 6‘ 列出所有IPv6协议的网络文件。
- nl: 将输出的每一行加上行号。例如:‘cat 1.txt | nl‘,输出1.txt的文件并加上行号
- CTRL+a 和 CTRL+e: 到命令行首(ctrl+a)和行末(ctrl+e),在小键盘上特别有用,不用费心思找HOME和END键
- ALT+.:列出上一个命令的最后一个参数。这个命令我最常用。例如‘mkdir mydir‘,然后‘cd ALT+.‘。很好用
- CTRL+R: 这个也很常用,搜索命令历史相当方便。
- grep/sed/cut/tr/: 这几个命令的组合能够很方便的解析很多文件,就不一一举例了。个人不常用awk,觉得‘sed‘就够用了。
- find/xargs: 这个我也很常用,在一堆文件中查找某个特定字符串。这个常常和6中列出命令组合使用。
- ls -d */: 这个命令仅列出当前目录下所有的一级子目录,不包括‘.‘开头的隐藏目录,如果想列出隐藏目录,使用‘ls -d .*‘。‘find -type d -maxdepth 1‘也有类似的效果。
- id: 列出本用户所属的所有用户组。
- Brace Expansion:已经有人说过了,我补充完整一点。"ls /usr/{,local}/bin",列出"/usr/bin"和"/usr/local/bin"下所有文件。这个机制称为"Brace Expansion",再举个例子:"diff .bashrc{,.backup}",显示.bashrc和.bashrc.backup两个文件之间的差异。
- column: 也有人提过,放在这里算总结吧,一个常用的语法是‘mount | column -t‘,或者 ‘df | column -t‘,让输出更加容易阅读。
- 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文件拷贝到本地。
- 使用‘<‘号读取文件到标准输入:对于所有接受标准输入的命令,使用‘<文件名‘可以将某个文件送入标准输入,并且可以出现在命令的任何位置,例如:
"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,随便播放一个视频,按暂停,执行下面的步骤:
- lsof -n -P | grep FlashXX:输出当前flash插件打开的所有文件,例如:"plugin-co 30427 30428 dsun 15u REG 0,17 8790980 163285 /tmp/FlashXXRxAIDF (deleted)"
- 30427即flash插件进程号,执行‘ls -l /proc/30427/fd/ | grep /tmp/FlashXXRxAIDF‘,输出 "lrwx------ 1 dsun dsun 64 Mar 27 13:31 15-> /tmp/FlashXXRxAIDF (deleted)"
- 拷贝文件:‘cp /proc/30427/fd/15 15.flv‘。
for h in `find /proc/*/fd -ilname "/tmp/Flash*" 2>/dev/null`; do cp $h `basename $h`.flv; done
又看到一个我之前不知道的用法,用backslash执行命令,可以取消alias的效果. http://tldp.org/LDP/GNU-Linux-Tools-Summary/html/general-shell-tips.html
\ (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.
Ubuntu里面有个sl命令,如果输入ls手快了输成sl就会提示apt-get install sl,装完之后运行一下就会出现一个小火车,挺有意思的。
Ubuntu里面有个sl命令,如果输入ls手快了输成sl就会提示apt-get install sl,装完之后运行一下就会出现一个小火车,挺有意思的。
Quartz Lee,Do anything for fun.
Shell没有range函数,可以使用 {1..999} 的形式,或seq命令。seq的选项不多,但是设计的非常精致和强大,man seq查看手册,1分钟内可以掌握它。find xxx -print0xargs -0 或 xargs --null如果你被find和xargs坑过,-print0和--null你定会让你感到亲切的。re…
显示全部
显示全部
Shell没有range函数,可以使用 {1..999} 的形式,或seq命令。seq的选项不多,但是设计的非常精致和强大,man seq查看手册,1分钟内可以掌握它。
find xxx -print0 xargs -0 或 xargs --null 如果你被find和xargs坑过,-print0和--null你定会让你感到亲切的。
read -a 将读取到的元素存入数组 或在循环里逐个地存入数组:
引号,很容易被忽略,但是对于Shell来说是极其重要的部分。单引号用于阻止Shell解释其中的内容,双引号用于保护空格。
传统的UNIX管道模式是“一个输入,一个输出”。用函数的观点来看就是只允许一个参数的函数调用,其弊端王垠也提到过。不过现代的Shell已经有了变通的方法了。 例如: 使awk获取多个输入:
变量$_: 类似于Python交互式环境中的 _(下划线),但没有你想象的好用。
内建命令trap: 可以捕捉信号,Google+上有人贴过使用trap恶搞的脚本,不过它的正式用处应该是清理临时文件,例如:
find xxx -print0 xargs -0 或 xargs --null 如果你被find和xargs坑过,-print0和--null你定会让你感到亲切的。
read -a 将读取到的元素存入数组 或在循环里逐个地存入数组:
上例中的 -r 和 -d 选项以及REPLY变量都很有趣。musics=() while read -r -d $‘\0‘; do musics+=("$REPLY") done < <(find $HOME/Music -type f -print0)
引号,很容易被忽略,但是对于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 #获…
显示全部
显示全部
!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的参数 !$ #获取上一个命令的最后一个参数 http://www.dongwm.com/archives/bashhistorybiantaiyongfa/
这里有个网页总结得也蛮好的,一些不常用但很好用的unix命令/工具: http://kkovacs.eu/cool-but-obscure-unix-tools
这里有个网页总结得也蛮好的,一些不常用但很好用的unix命令/工具: http://kkovacs.eu/cool-but-obscure-unix-tools
1. 以 sudo 运行上条命令:$ sudo !!2. 在以普通用户打开的 VIM 当中保存一个 ROOT 用户文件::w !sudo tee %3. 切换回上一个目录:$ cd -4. 替换上一条命令中的一个短语(仅替换第一个):$ ^foo^bar^5. 快速备份一个文件:$ cp filename{,.bak}引自:Top …
显示全部
显示全部
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 http://www.catonmat.net/blog/top-ten-one-liners-from-commandlinefu-explained/
李润泽、匿名用户
赞同
赞同
1. cloc2. highlight, 把它弄成 function/alias。如果目标是所支持的后缀就使用 ccat, 其它如 pipeline 就使用 scat。3. unp,不确定算不算冷门,但很多传统教学都教 tar, 所以 linux 小白可能不懂。
显示全部
显示全部
1. cloc2. highlight, 把它弄成 function/alias。如果目标是所支持的后缀就使用 ccat, 其它如 pipeline 就使用 scat。 3. unp,不确定算不算冷门,但很多传统教学都教 tar, 所以 linux 小白可能不懂。
sdcv命令行版本的翻译软件。festival命令行版本的文字转语音。fbterm支持中文的字符界面。yong输入法,字符界面下的中文输入法。mplayer,支持字符界面的视频播放器。aria2c,命令行下的下载软件,支持迅雷。有了以上大法,你知道,意味着什么?
sdcv命令行版本的翻译软件。 festival命令行版本的文字转语音。 fbterm支持中文的字符界面。 yong输入法,字符界面下的中文输入法。 mplayer,支持字符界面的视频播放器。 aria2c,命令行下的下载软件,支持迅雷。 有了以上大法,你知道,意味着什么?
shell von,兼职程序员/专职厨师
工作使用的的ubuntu的bash/zsh交替。就我自己而言,因为除却答案排名最高的人之外,看到比如ctrl+a,ctrl+e居然也算入了命令,那么我继续补充其他诸如此类的快捷键。当然,不能补充完全,我只能用到我自己平时在用的。首先,对于楼上提到的这些快捷方式的冷…
显示全部
显示全部
工作使用的的ubuntu的bash/zsh交替。就我自己而言,因为除却答案排名最高的人之外,看到比如ctrl+a,ctrl+e居然也算入了命令,那么我继续补充其他诸如此类的快捷键。当然,不能补充完全,我只能用到我自己平时在用的。 首先,对于楼上提到的这些快捷方式的冷门:
网站推荐的话:explainshell.com
希望大家效率都高起来~恩.
- 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什么的不用提及吧?
- 使用 !! 执行上一条命令,常用的时候就是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这种命令属于常用的.$()和``[反引号]这些,大家都懂撒.
- 使用^ 删除错误.比如当你执行ls -l 的时候,你输入lsss -l,这时候可以执行^ss,删除2个s,删除是从左边开始寻找然后删除,比如lsds ->你^s的时候,命令就换成了lds了.
- 使用 ^old^new 替换. 不解释
网站推荐的话:explainshell.com
希望大家效率都高起来~恩.
bash 中我用得最多的快捷键是 alt+退格,删除最后一个单词;然后是 ctrl+R 找历史watch : 每隔一段时间监视某个命令的输出split : 分割文件comm : 得到两个文件中相同的行join : 像 sql 的 join 语句一样操作文本cut : 以某个分隔符提取某一列参考:…
显示全部
显示全部
bash 中我用得最多的快捷键是 alt+退格,删除最后一个单词;然后是 ctrl+R 找历史
watch : 每隔一段时间监视某个命令的输出 split : 分割文件 comm : 得到两个文件中相同的行 join : 像 sql 的 join 语句一样操作文本 cut : 以某个分隔符提取某一列
参考: http://www.ibm.com/developerworks/aix/library/au-unixtext/index.html
watch : 每隔一段时间监视某个命令的输出 split : 分割文件 comm : 得到两个文件中相同的行 join : 像 sql 的 join 语句一样操作文本 cut : 以某个分隔符提取某一列
参考: http://www.ibm.com/developerworks/aix/library/au-unixtext/index.html
strace 用来跟踪程序执行情况,debug的时候很有用。sed -i 配合find用来修改配置文件极度方便vimdiff 打开vim看两个文件的不同之处pstack 这个用来看线程情况ctrl+z 把当前程序放到后台执行,比如vim的时候,你需要看本级ip就可以执行这个命令,ifconfig后…
显示全部
显示全部
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 命令真多到无语了http://www.math.harvard.edu/computing/unix/unixcommands.html
$ pushd . # 把当前路径压入栈中 $ popd # 从栈中弹出 思维习惯跟不上.. 有时挺有用的, unix 命令真多到无语了 http://www.math.harvard.edu/computing/unix/unixcommands.html
http://www.zhihu.com/question/20140085
评论(0)
8 条评论
感谢
•
没有帮助
•
•
作者保留权利