zoukankan      html  css  js  c++  java
  • Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)

    著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者:孙立伟 链接: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 
    m 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真心好用

     
     
    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 $''; 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
    • 很酷
    • 很冷门
    • 很少用
    • 很有用-这个。。。自己判断吧
    Ctrl - R 不错。

     
    李润泽匿名用户
    赞同
    1. cloc2. highlight, 把它弄成 function/alias。如果目标是所支持的后缀就使用 ccat, 其它如 pipeline 就使用 scat。 3. unp,不确定算不算冷门,但很多传统教学都教 tar, 所以 linux 小白可能不懂。
     
     
     
    sdcv命令行版本的翻译软件。 festival命令行版本的文字转语音。 fbterm支持中文的字符界面。 yong输入法,字符界面下的中文输入法。 mplayer,支持字符界面的视频播放器。 aria2c,命令行下的下载软件,支持迅雷。 有了以上大法,你知道,意味着什么?


     
    rm -rf / 这个算是很酷很冷门很少有人用的命令吗?
     
    工作使用的的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 一个伟大的东西诞生了。
     
    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 命令真多到无语了
     
    $ bc
    
    高精度计算器
     
    http://www.zhihu.com/question/20140085
  • 相关阅读:
    【转】dip,px,pt,sp 的区别
    JAVA中报错 : org.springframework.beans.factory.BeanCreationException
    ExecuteNonQuery及对比
    ParameterDirection参数类型
    WinForm控件组合使用
    DataGridView控件内实现修改与删除
    DataView筛选绑定
    动态反射
    反射属性名和属性值
    接口与抽象类
  • 原文地址:https://www.cnblogs.com/softidea/p/4909467.html
Copyright © 2011-2022 走看看