linux/unix 上那些炫酷的命令行工具(一)

  • 2019 年 12 月 22 日
  • 筆記

工欲善其事,必先利其器,作為一名手藝人, 我們應該利用好工具,以便將我們的時間用在更有效率的事情上,類 Linux 上很多原生的如 catgrep 等命令給我們帶來了很多便利,但其實都或多或少有可以改進的地方,市面上其實出現了大量開發者開發的對這些原生做了很大改進的命令,比原生的命令更好用,大部分可以說是秒殺原生命令了,能讓你事半功倍,強烈推薦

如何執行原生的命令

個人覺得即將介紹的命令很好用,完全可以替代原生命令,也設置了大量的 alias 語句來替代原生命令,不過每個人的習慣不一樣,如果你覺得即將介紹的命令用得不習慣 ,想用回原生的命令也可以,按類似以下的操作即可

cat # 忽略所有 alias 為 cat 的命令 - explanation: https://stackoverflow.com/a/16506263/22617  # 或  command cat # 忽略所有函數和 aliases

廢話不說,讓我們看看哪此命令足以替代原生命令吧

bat > cat

原生的 cat 命令只是簡單地列印某個文件的內容,但 bat 命令在此基礎上還可以做到以下功能

  • 自動識別文件擴展名並進行高亮顯示
  • 顯示行號
  • 文件內容過長時自動分頁
  • 如果文件內容過長,還可以用 / 來搜索相關的內容

功能演示如下

推薦用 alias 命令將 cat 設置成 bat

alias cat='bat'

? 點擊這裡可安裝 bat

fzf > ctrl+r

什麼是 fzf 呢

It's an interactive Unix filter for command-line that can be used with any list; files, command history, processes, hostnames, bookmarks, git commits, etc.

它是一款使用 GO 語言編寫的互動式的 Unix 命令行工具。可以用來查找任何列表內容、文件、歷史命令、 本機綁定的host、 進程、 Git 分支、進程等。所有的命令行工具可以生成列表輸出的都可以再通過管道 pipe 到 fzf 上進行搜索和查找

我們簡單介紹一下它的查找歷史命令的功能,查看歷史輸入的終端命令我們一般用 ctrl+r,在這方面,fzf 可以說是秒殺 ctrl+r了,ctrl+r 只能呼出最近一條包含輸入字元串的歷史命令,而且只能做精確匹配,而安裝了 fzf 後,當呼出 ctrl+r 會顯示所有包含輸入字元串的命令(默認匹配最近一條符合搜索條件的命令),按上下箭頭即可自由選擇你想要的命令,而且支援模糊搜索,這個特性針對那些常常只是隱約記得歷史命令的人特別有用,比如如果我隱約記得有個命令和 gitfinance 有關,我可以這麼搜

當然如果你不需要模糊搜索也可以關掉

fzf 的功能遠不止於此,與其他命令結合讓你的效率飛速提升,自動補全功能完全秒殺默認的 tab 功能,再安裝一個具有預覽功能的 highlight插件,好用到爆炸,不信看以下功能展示

? 點擊這裡可安裝 fzf

htop > top

top 命令可以說是查看進程與系統運行的利器了,不過 htop 不僅具備 top 的所有功能,還有一些 top 不具備但很實用的功能,簡單列舉幾個

  • 顯示每個 CPU 的負載情況,如果 CPU 是四核八執行緒的,會顯示每個執行緒的負載情況,而且不同的指標用顏色區分開來,更直觀,對用戶更友好
  • 互動式
    1. 可以左右滑動顯示此進程的所有資訊與對應的 COMMAND,也可以上下滑動顯示所有的進程資訊,而 top 只能顯示最消耗資源的進程列表
    2. 可以以樹狀圖的方式查看進程對應的多個子執行緒或進程佔用的文件
    1. 方便追蹤進程的運行情況,如果我們要觀察某個進程的運行情況,使用 top 沒法定位某個進程,進程在螢幕上的顯示會忽上忽下,每次 top 刷新我們都必須去用肉眼追蹤我們正在觀察的進程,很不方便(所有進程的顏色都一樣),而用 htop 就簡單了,我們可以按下空格鍵標記我們想要的進程,被標記的進程會高亮展示,同時按 F 可以保證被標記的進程出現在螢幕里
    2. 用 htop 可以直接給多個進程發訊號,這樣能很方便地實現像 kill 進程之類的操作,一般我們要 kill 掉某個進程要經過兩個步驟: 1、輸入 top 獲得我們想要 kill 執行緒的 pid. 2、退出 top 輸入 kill PID,由於 top 命令不能執行搜索功能,光是找 PID 這一步就夠嗆, 而用 htop 可以很輕易地做到,輸入 htop 後,按 F3 輸入進程名稱進行查找,然後換空格選中此進程(也可以選中多個進程),再換 F9 選中左邊的 SIGKILL 即可將選中的進程 kill 掉,以 kill 掉 htop 進程為例,操作如下

    可以看到效率上比 top 不知高了多少倍

我們可以設置 top 的 alias 以便利用 htop 的強大功能

alias top="sudo htop" # alias top and fix high sierra bug

? 點擊這裡可安裝 htop

diff-so-fancy > diff

默認的 git diff 顯示不太友好,也不支援訂製配色方案,而且僅能支援行級別的 diff, diff-so-fancy 默認的配色方案不僅是 human readable,而且支援字元級別的 diff,所以推薦 git diffdiff-so-fancy,默認的 diff 和 diff-so-fancy 對比如下

? 點擊這裡可安裝配置 diff-so-fancy

fd > find

默認的 find 命令不太好用,查找命令比較複雜冗餘,考慮以下三種情形

  1. 查找所有擴展名為 md 的後綴
  2. 查找所有文件名包含 cli 的文件
  3. 查找所有包含 cli 的文件中的單詞數

我們來看下分別用 find 和 fd 的對比

// use find  find . -type f -name "*.md"  find . -name '*cli*'  find ./ -type f -name "*php*" -exec wc -w {} +    // use fd  fd -e md  fd md # all with .md extension  fd cli -x wc -w 

可以看到,用 fd 命令極簡,更關鍵的是在文件多的情況下 fd 還有另一大優勢:性能!fd 的搜索效率可以達到 find 的 20 倍以上? 點擊這裡可安裝配置 fd

ncdu > du

ncdu 可以理解為是互動式的 du。我們一般用 du 來查找某個目錄佔用了多少磁碟空間,但如果我們需要查看這個目錄下的子目錄/文件佔用了多少空間並對其進行排序 du 就無能為力了,而用 ncdu 的話我們只要在目錄輸入此命令即可顯示按空間大小降序排序的所有文件/目錄

而且比較方便的一點是 ncdu 是互動式的,如果我們還想看子目錄里的文件/目錄大小,只需要按上下箭頭選中相關目錄按回車即可查看子目錄詳情的空間佔用情況,速度極快!另外也可刪除文件,可以在選中子目錄時執行相當於 cd 到此子目錄的命令(此時會退出 ncdu , 並 cd 到此子目錄)。還有一個比較騷的功能是點擊 cmd + 選中的目錄/文件可以打開當前目錄/文件 我們可以為 du 設置 ncdu 的 alias,配上主題優雅很多

// --color 設置主題,--rr 只讀模式,防止執行 ncdu 時刪除文件以及 cd 到某個子目錄  alias du="ncdu --color dark -rr -x --exclude .git --exclude node_modules"

效果如下

? 點擊這裡可安裝配置 ncdu