Text-Processing

列印/etc/passwd的一些欄位

  • August 30, 2015

我有一個關於在 Linux 中使用萬用字元的問題。在這裡,我從 /etc/passwd 文件中的一長串列中找到了一些行。

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
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
...

什麼是和適當的命令/命令僅從該行列印出使用者名、UID 號和 GID 號(如果可能顯示多種方式,以便我可以進一步探索)?

不需要“萬用字元”或正則表達式的一種方法是使用cut. cut可以處理文本文件中指定字元分隔的行,這/etc/passwd恰好是。

cut -d: -f1,3,4 /etc/passwd

輸出將具有以冒號分隔的欄位。看起來 GNUcut有一個額外的選項“–output-delimiter”,但你也可以使用tr

cut -d: -f1,3,4 /etc/passwd | tr ':' '\t'

像這樣工作的選項cut

  • -d:- 使用冒號作為欄位分隔符。預設為選項卡。
  • -f1,3,4- 輸出欄位編號 1、3 和 4。cut使用 1 索引欄位,從行的左側開始。欄位 2 將是“x”,過去出現過加密密碼。

awk命令也可以工作:

awk -F : '{print $1, $3, $3}' /etc/passwd

-F :選項告訴awk使用冒號分隔欄位。awk將一行中的欄位稱為 $ 1, $ 2, $ 3 … from left to right. $ 0 包含整行,這通常是您要列印的內容,但這次不是。

sed可以這樣做:

sed 's/^\([^:]*\):\([^:]*\):\([^:]*\):\([^:]*\):..*/\1 \3 \4/' /etc/passwd 

sed命令中,我們終於得到了“萬用字元”,儘管在這種情況下它們看起來很難看。

我的建議是更喜歡這個cut命令。該sed範例表明,獲取您想要的內容的正則表達式可能很醜陋,因此很難獲得正確。awk可以做更多cut的事情,awk因為預設情況下使用空格來分隔標記。這可以節省擺弄cut欄位分隔符規範的時間。

引用自:https://unix.stackexchange.com/questions/101424