歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> 最牛B的 Linux Shell 命令 系列連載(三)

最牛B的 Linux Shell 命令 系列連載(三)

日期:2017/2/28 16:31:23   编辑:SHELL編程

1. 更友好的顯示當前掛載的文件系統

1
mount | column -t

這條命令適用於任何文件系統,column 用於把輸出結果進行列表格式化操作,這裡最主要的目的是讓大家熟悉一下 columnt 的用法。

下面是單單使用 mount 命令的結果:

1
2
3
4
5
$ mount
 
/dev/root on / type ext3 (rw)
/proc on /proc type proc (rw)
/dev/mapper/lvmraid-home on /home type ext3 (rw,noatime)

而加了 column -t 命令後就成為這樣了:

1
2
3
4
5
$ mount | column -t
 
/dev/root on / type ext3 (rw)
/proc on /proc type proc (rw)
/dev/mapper/lvmraid-home on /home type ext3 (rw,noatime)

另外你可加上列名稱來改善輸出結果

1
2
3
4
5
6
$ (echo "DEVICE - PATH - TYPE FLAGS" && mount) | column -t
 
DEVICE                    -   PATH   -     TYPE   FLAGS
/dev/root                 on  /      type  ext3   (rw)
/proc                     on  /proc  type  proc   (rw)
/dev/mapper/lvmraid-home  on  /home  type  ext3   (rw,noatime)

列2和列4並不是很友好,我們可以用 awk 來再處理一下

1
2
3
4
5
6
$ (echo "DEVICE PATH TYPE FLAGS" && mount | awk '$2=$4="";1') | column -t
 
DEVICE                    PATH   TYPE   FLAGS
/dev/root                 /      ext3   (rw)
/proc                     /proc  proc   (rw)
/dev/mapper/lvmraid-home  /home  ext3   (rw,noatime)

最後我們可以設置一個別名,為 nicemount

1
$ nicemount() { (echo "DEVICE PATH TYPE FLAGS" && mount | awk '$2=$4="";1') | column -t; }

試一下

1
2
3
4
5
6
$ nicemount
 
DEVICE                    PATH   TYPE   FLAGS
/dev/root                 /      ext3   (rw)
/proc                     /proc  proc   (rw)
/dev/mapper/lvmraid-home  /home  ext3   (rw,noatime)

2. 運行前一個 Shell 命令,同時用 “bar” 替換掉命令行中的每一個 “foo”

1
!!:gs/foo/bar

!! 表示重復執行上一條命令,並用 :gs/foo/bar 進行替換操作。

關於 !! 這個用法在前一篇文章中已有詳細的介紹。

3. 實時某個目錄下查看最新改動過的文件

1
watch -d -n 1 'df; ls -FlAt /path'

watch 是實時監控工具,-d 參數會高亮顯示變化的區域,-n 1 參數表示刷新間隔為 1 秒。

df; ls -FlAt /path 運行了兩條命令,df 是輸出磁盤使用情況,ls -FlAt 則列出 /path 下面的所有文件。

ls -FlAt 的參數詳解:

  • -F 在文件後面加一個文件符號表示文件類型,共有 /=>@| 這幾種類型, 表示可執行文件,/ 表示目錄,= 表示接口( sockets) ,> 表示門, @ 表示符號鏈接, | 表示管道。
  • -l 以列表方式顯示
  • -A 顯示 ...
  • -t 根據時間排序文件

4. 通過 SSH 掛載遠程主機上的文件夾

1
sshfs name@server:/path/to/folder /path/to/mount/point

這條命令可以讓你通過 SSH 加載遠程主機上的文件系統為本地磁盤,前提是你需要安裝 FUSE 及 sshfs 這兩個軟件。

譯者注:關於 sshfs 實際上我之前寫過一篇文章介紹過,詳見在 Ubuntu 上使用 sshfs 映射遠程 ssh 文件系統為本地磁盤

卸載的話使用 fusermount 或 umount 命令:

1
2
$ fusermount -u /path/to/mount/point
# umount /path/to/mount/point

5. 通過 DNS 來讀取 Wikipedia 的詞條

1
dig +short txt <keyword>.wp.dg.cx

這也許是最有趣的一條技巧了,David Leadbeater 創建了一個 DNS 服務器,通過它當你查詢一個 TXT 記錄類型時,會返回一條來自於 Wikipedia 的簡短的詞條文字,這是他的介紹

這裡有一個樣例,來查詢 “hacker” 的含義:

1
2
3
4
5
6
7
8
$ dig +short txt hacker.wp.dg.cx
 
"Hacker may refer to: Hacker (computer security), someone involved
in computer security/insecurity, Hacker (programmer subculture), a
programmer subculture originating in the US academia in the 1960s,
which is nowadays mainly notable for the free software/” “open
source movement, Hacker (hobbyist), an enthusiastic home computer
hobbyist http://a.vu/w:Hacker"

這裡使用了 dig 命令,這是標准的用來查詢 DNS 的系統管理工具,+short 參數是讓其僅僅返回文字響應,txt 則是指定查詢 TXT 記錄類型。

更簡單的做法是你可以為這個技巧創建一個函數:

1
2
3
4
5
wiki() { dig +short txt $1.wp.dg.cx; }
#然後試試吧:
wiki hacker
 
"Hacker may refer to: Hacker (computer security), …"

如果你不想用 dig ,也可以用 host 命令:

1
host -t txt hacker.wp.dg.cx

另外在Twitter上看過某人的創意,用普通的dns來作為程序版本更新的查詢服務器:設定域名software-version-check.example.com的A記錄為1.2.40.3,對比自己的版本號,嗯,有更新了!

6. 用 Wget 的遞歸方式下載整個網站

1
wget --random-wait -r -p -e robots=off -U Mozilla www.example.com

參數解釋:
–random-wait 等待 0.5 到 1.5 秒的時間來進行下一次請求
-r 開啟遞歸檢索
-e robots=off 忽略 robots.txt
-U Mozilla 設置 User-Agent 頭為 Mozilla

其它一些有用的參數:

  • –limit-rate=20K 限制下載速度為 20K
  • -o logfile.txt 記錄下載日志
  • -l 0 刪除深度(默認為5)
  • -wait=1h 每下載一個文件後等待1小時

7. 復制最後使用的命令中的參數

1
<ALT + .> or <ESC + .>

這個快捷鍵只能工作於 shell 的 emacs 編輯模式,它可以從最後使用的命令行中復制參數到當前命令行中,下面是一個樣例:

1
2
3
4
5
$ echo a b c
a b c
 
$ echo <Press ALT + .>
$ echo c

你可以重復執行該快捷鍵,以便獲取自已需要的參數,

以下是樣例:

1
2
3
4
5
6
7
8
9
10
$ echo 1 2 3
1 2 3
$ echo a b c
a b c
 
$ echo <Press ALT + .>
$ echo c
 
$ echo <Press ALT + .> again
$ echo 3

另外,假如你想指定第1個或第2個,或者是第 n 個參數的話,可以按 ALT + 1 (或 ESC + 1) 或 ALT + 2 (或 ESC +2) 這樣形式的快捷鍵。

以下是樣例:

1
2
3
4
5
6
7
8
9
10
$ echo a b c
a b c
 
$ echo <Press ALT + 1> <Press ALT + .>
$ echo a
a
 
$ echo <Press ALT + 2> <Press ALT + .>
$ echo b
b

查看Emacs Editing Mode Keyboard Shortcuts一文獲取更多類似的快捷鍵。

8. 執行一條命令但不保存到 history 中

1
$ <space>command

這條命令可運行於最新的 Bash shell 裡,在其它 shell 中沒測試過。

通過在命令行前面添加一個空格,就可以阻止這條命令被保存到 bash history (~/.bash_history) 文件中,這個行為可以通過 $HISTIGNORE shell 變量來控制。我的設置是 HISTIGNORE=”&:[ ]*” ,表示不保存重復的命令到 history 中,並且不保存以空格開頭的命令行。$HISTIGNORE 中的值以冒號分隔。

如果你的命令內包含密碼,比如mysqladmin,不把它記錄在歷史當中是好主義。

深入了解的話,可進一步看此文The Definitive Guide to Bash Command Line History

9. 顯示當前目錄中所有子目錄的大小

1
du -h --max-depth=1

–max-depth=1 參數可以讓 du 命令顯示當前目錄下 1 級子目錄的統計信息,當然你也可以把 1 改為 2 ,進一步顯示 2 級子目錄的統計信息,可以靈活運用。而 -h 參數則是以 Mb 、G 這樣的單位來顯示大小。

譯者注:在此推薦一個小工具 ncdu ,可以更方便的達到此效果。

10. 顯示消耗內存最多的 10 個運行中的進程,以內存使用量排序

1
ps aux | sort -nk +4 | tail

顯然這並不是最好的方法,但它確實用起還不錯。

這是一個典型的管道應用,通過 ps aux 來輸出到 sort 命令,並用 sort 排序列出 4 欄,再進一步轉到 tail 命令,最終輸出 10 行顯示使用內存最多的進程情況。

假如想要發現哪個進程使用了大量內存的話,我通常會使用 htop 或 top 而非 ps 。

11. 用 python 快速開啟一個 SMTP 服務

1
python -m smtpd -n -c DebuggingServer localhost:1025

這是一個用 Python 標准庫 smtpd (用 -m smtpd 指定) 實現在簡易 SMTP 服務,運行於 1025 端口 。

另外三個參數的解釋:
-n 參數讓 Python 不要進行 setuid ( 改變用戶)為 “nobody” ,也就是說直接用你的帳號來運行
-c DebuggingServer 參數是讓 Python 運行時在屏幕上輸出調試及運行信息
* localhost:1025 參數則是讓 Python 在本地的 1025 端口上開啟 SMTP 服務

另外,假如你想讓程序運行於標准的 25 的端口上的話,你必須使用 sudo 命令,因為只有 root 才能在 1-1024 端口上開啟服務。如下:

1
sudo python -m smtpd -n -c DebuggingServer localhost:25
Copyright © Linux教程網 All Rights Reserved