- 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'。
不过,根据上面commandlinfu中的另一个说法,可以直接这样做:
for h in `find /proc/*/fd -ilname "/tmp/Flash*" 2>/dev/null`; do cp $h `basename $h`.flv; done
---更新5----
又看到一个我之前不知道的用法,用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.
nc,可以在没有ssh的情况下传输文件,配合tar真心好用
Quartz Lee,Do anything for fun.
显示全部
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
显示全部
显示全部
$ 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/
牛杰,阿里云专家、资深域名行业从业者、技术工…
- 很酷
- 很冷门
- 很少用
- 很有用-这个。。。自己判断吧
赞同
显示全部
显示全部
- 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,哈哈!
显示全部
watch : 每隔一段时间监视某个命令的输出 split : 分割文件 comm : 得到两个文件中相同的行 join : 像 sql 的 join 语句一样操作文本 cut : 以某个分隔符提取某一列
参考: http://www.ibm.com/developerworks/aix/library/au-unixtext/index.html
显示全部
题叶,Ubutnu12.04 && Gnome3
赞同
$ bc
高精度计算器