Linux 經常使用 AWK 來依照某個條件來垂直分割字串, ex:
- echo "a b c d" | awk '{print $2}' # 印出 b
- echo "a b c d" | awk -F' ' '{print $2}' # 印出 b, -F: 依照一個空白分隔切割字串
但是, 上述範例 'a b c d' 想要依照空白分隔, 但是要列出 'b c d', 要怎麼做呢?
AWK 列出 第一個分隔後 的所有資料
想要列出第一個分隔後的資料, 似乎沒有簡單快速的方法, 都得要跑 for 來達成, 於是就照下述作法:
- echo "a b c d" | awk '{for (i=2; i <= NF; i++) {printf $i" "} printf "\n"}' # 印出 b c d
- echo "a b c d" | awk -F' ' '{for (i=2; i <= NF; i++) {printf $i" "} printf "\n"}' # 印出 b c d
- awk -F" " '{for (i=2; i <= NF; i++) {printf $i" "} printf "\n"}' test.txt # test.txt 內容就是垂直文字內容
- 註: NF 是此次分割的總分割數量, 是 awk 內定的變數, 直接使用即可.
感謝長輩們的指點:
- GSLin: echo "a b c d" | sed -e 's/^[^ ]* *//'
- 榮尼王: echo "a b c d" | awk '{ print substr($0, index($0, " ") + 1); }'
- carrl yea: echo "a b c d" | awk '{ $1=""; print $0 }'
sed -e 's/^[^ ]* *//'
長輩這行精簡又快速~ 感恩~ Orz.
用 substr 和 index 組合就行了
> cat /etc/passwd | head -n 3
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
> cat /etc/passwd | head -n 3 | awk '{ print substr($0, index($0, ":") + 1); }'
x:0:0:root:/root:/bin/bash
x:1:1:daemon:/usr/sbin:/bin/sh
x:2:2:bin:/bin:/bin/sh
嗯嗯, 原來有 substr 可以用, 感謝~ Orz.