2022年9月18日 星期日

ip 指令漂亮列印

查看所有網卡裝置的指令 ip a 印出來的資料令人眼花撩亂; 可是大部分我都看不懂也沒在看。 可以只印看得懂的欄位就好嗎? 如果你的網路知識跟我一樣弱, 想要略過大部分資訊, 可以先安裝 zq, 然後在 ~/.bashrc 裡面加上這一句: alias ipa="ip -j a | zq -f csv 'over this | {ifname,address,ip_addr:missing(addr_info[0].local)?\"\":addr_info[0].local} | fuse' - | column -s, -t" 那麼下次進入 bash, 就可以用 ipa 指令查看精簡版的資訊。

  1. 首先, ip -j a 可以採用 json 格式輸出 ip a 的結果。
  2. 再來請試試這個指令:
    ip -j a | zq -f csv 'over this | {ifname,address}' - 這會叫 zq 只撈出 「裝置名稱」 與 「mac address」 兩欄, 採 csv 格式印出。
  3. 至於 ip 位址那一欄, 並不是每個裝置都有被分配到 ip 位址, 所以如果直接加上 addr_info[0].local 一欄, 經常會出錯。 這時要加上 fuse 來安撫 zq。 請試試看:
    ip -j a | zq -f csv 'over this | {ifname,address,ip_addr:addr_info[0].local} | fuse' -。 這已經很接近我們要的答案, 只是輸出當中的警告訊息太冗長。
  4. 所以用三元運算子 "? :" 來判斷, 如果出錯, 就輸出空字串:
    ip -j a | zq -f csv 'over this | {ifname,address,ip_addr:missing(addr_info[0].local)?"":addr_info[0].local} | fuse' -
  5. 最後把結果 pipe 給 column -s, -t 就得到整齊漂亮的輸出。
  6. 要寫成 alias 時, 需要把雙引號 escape 掉, 所以就得到文章最開始的那一句。

[註: 順便把所有的 jq 標籤通通改成 json; 所有談到 zq 的文章也加上 json 標籤。]

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。