Unix / 類 Unix shell 中有哪些很酷很冷門很少用很有用的命令?

我知道一個esc+.這個,在AIX里用的是KSH,向上箭頭翻不出歷史命令,這是只要按下esc+.號就會出現上一次命令的參數,例如,上一次命令是vim /etc/grub/grub.conf ,這是,按下esc+.就出現/etc/grub/grub.conf,然後ctrl+a到前面,加個命令(cat,ll等)就可以了。


感謝邀請。這個問題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"
"&

上面三個命令的效果是一模一樣的。

----更新-----

這裡補充說明一下,上面的幾個技巧中所有命令行編輯的快捷鍵(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的效果.

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
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.


!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/


bash 中我用得最多的快捷鍵是 alt+退格,刪除最後一個單詞;然後是 ctrl+R 找歷史

watch : 每隔一段時間監視某個命令的輸出

split : 分割文件

comm : 得到兩個文件中相同的行

join : 像 sql 的 join 語句一樣操作文本

cut : 以某個分隔符提取某一列

參考:

http://www.ibm.com/developerworks/aix/library/au-unixtext/index.html


工作使用的的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

希望大家效率都高起來~恩.


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


nc,可以在沒有ssh的情況下傳輸文件,配合tar真心好用


strace, 秒殺大部分debug


Ubuntu裡面有個sl命令,如果輸入ls手快了輸成sl就會提示apt-get install sl,裝完之後運行一下就會出現一個小火車,挺有意思的。


ipcs -a 查看共享內存段,排錯利器


$ pushd . # 把當前路徑壓入棧中

$ popd # 從棧中彈出

思維習慣跟不上.. 有時挺有用的, unix 命令真多到無語了

http://www.math.harvard.edu/computing/unix/unixcommands.html


在大學時候自學Linux,用過很長時間的Linux命令行,後來總結了一下寫了一篇blog,再次將我的blog貼過來。原文在http://junlintianxia.iteye.com/blog/393440

本文將記錄一些在使用Linux過程中,在命令行中進行工作的高效率命令,隨著時間的積累如果我有新的技巧也將在本篇博文中更新。如果您也有高效率的小技巧,歡迎留言給我

1. 查找Java項目中,main方法定義在哪個文件里.

切換到你要查找項目的目錄下執行

grep -rlI "& 如果你覺得自己打字快,不怕麻煩執行如下命令也可以找到該文件

find -type f -name *.java -exec grep -l "&

2 快速的建立一個文件,並輸入一些內容

cat &>&> filename ,輸入一些內容然後按Ctrl-d結束輸入。

注意:如果filename已經存在則內容將被清空

3 將文本文件中DOS換行符號轉化為UNIX的換行符號

tr -s "
" "
" & 如果你要將結果保存到outputfile文件

tr -s "
" "
" &outputfile

當然你使用vim編輯文件時,vim也提供文件轉換功能

4 查看某年某月某日是星期幾

比如我要查看 2008年5月22日是星期幾那用cal來查看

cat 5 2008 顯示2008年5月的日曆

您是否發現命令行操作比圖形界面瀏覽查看要快多了呢?

5 快速的區域網內文件共享。

一般來說類linux系統之間的文件共享通常使用nfs,而linux

和Windows文件共享則使用samba,這兩個伺服器功能強大,但是使用起來免不了要配置一番

如果你的機器上裝了python可以使用python自帶的http伺服器

進入你要共享文件的目錄執行, ptyhon -m SimpleHTTPServer

對方只要在瀏覽器里輸入你的IP地方加8000埠(例如192.168.1.104:8000)就可以看到共享目錄下文件。

6 用最簡單命令殺死一個進程

以前為了結束一個進程通常是 ps -aux | grep xxx

然後再查看該進程的ID,最後是 kill 進程ID。

如果你管道用的很熟,awk又會用一點,則有可能打下如此拉風的命令

ps ax | grep firefox | grep -v grep | awk "{ print $1 }" | xargs kill -9

其實你沒必要使用那麼多的管道加awk,有個很簡單的命令pkill

執行pkill -9 firefox 就終結firefox進程。


ack, 一個perl寫的源代碼工具


DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" pwd )"

bash one-liner,獲取腳本所在位置

P.S. 單純dirname一下$0是錯誤的,為啥是錯誤的就當課後練習了


Ctrl - R 不錯。


  • coprocess:

一個程序有多個輸入文件,多個輸出文件,現在想從多個壓縮的輸入,產生多個壓縮的輸出:

someapp &<(zcat input1.gz) &<(bzcat input2.bz2) &>(gzip -c &> output1.gz) &>(gzip -c &> output2.gz)

  • paste:

一個 gzip 壓縮的文本文件中包含很多條記錄,每條記錄有固定的 n 個(比如 5 個)欄位,每個欄位一行,現在,把這個數據轉化成每條記錄佔一行,多個欄位之間用 分隔(假定數據中不包含 ):

zcat input.gz | paste - - - - - &> output.txt


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/


whoami

  • 很酷

  • 很冷門

  • 很少用

  • 很有用-這個。。。自己判斷吧


1. cloc

2. highlight, 把它弄成 function/alias。如果目標是所支持的後綴就使用 ccat, 其它如 pipeline 就使用 scat。

3. unp,很多傳統教學都教 tar, 所以算冷門。

[ 2016 更新 ]

4. ncdu ,在命令行互動式列舉占空間最大至最小的目錄/文件,兼支持 Enter 進去/退出目錄(如同你使用 file explorer)。在備份或空間不足的時候,我都會用它鎖定哪一個目錄,哪一個文件,占的空間最大。這是我一用就愛上的工具,徹底解決 nautilus 的缺陷。

5. glances ,集結了 top, transfer rate per network card, io, 空間 volume 資訊。不算很有用(畢竟有獨立的工具可以取代),但值得一試。我通常都是用它來看 Network card 有沒有在運輸。

6. wtf

7. bashbug

8. geekcode

9. wall,發送信息給每一個 shell session 的用戶,適用於 ssh 發送提醒信息 (需要 reboot 云云)。

10. ascii ,學 c 的時候,我常常用來參考的。

11. amixer,把它設置成 alias, 以後我輸入 "a" 就能把聲音調到最小。適用於聽歌的時候,電腦突然爆音,趕緊輸入 a。

[2017 更新]: 鍵盤有關音的鍵就不需要了。

12. wayback, 有用過 wayback 的童鞋應該都懂無法排除 404/500 的頁面,需要一個一個日期去點擊。 好啦我承認這是我自己編寫的命令,不過都是善用了 linux 命令所構成的。

[2017 更新]:自從用了火狐的插件 ,這個命令就不重要了。

13. namei。顯示某個文件的 symlink -&> symlink -&> symlink 一直到終點, 畢竟 realpath 不能了解中間 symlink 的過程。 唯一不足的是無法顯示精簡的一行如 www -&> xxx -&> yyy -&> zzz。


cowsay

sl

命令中的戰鬥機


這裡有個網頁總結得也蠻好的,一些不常用但很好用的unix命令/工具: http://kkovacs.eu/cool-but-obscure-unix-tools


推薦閱讀:

epoll的邊沿觸發模式(ET)真的比水平觸發模式(LT)快嗎?(當然LT模式也使用非阻塞IO,重點是要求ET模式下的代碼不能造成飢餓)
既然有 UNIX 哲學,那有沒有 Windows 哲學呢?
為什麼微軟,谷歌要另立操作系統山頭,而不是像蘋果一樣,在最正統的 Unix 基礎上開發?
posix和system v 信號量哪個更快?
同為開源的類unix系統,為什麼FreeBSD遠沒有Linux流行?

TAG:Linux | Unix | Shell編程開發 |