/etc/passwd の一部のフィールドを印刷します。

/etc/passwd の一部のフィールドを印刷します。

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番号のみを印刷するのに適したコマンドは何ですか? (可能であれば、さらに詳しく知るためにいくつかの方法を紹介してください。)

答え1

「ワイルドカード」や正規表現を必要としない1つの方法は、テキストファイル内の文字で区切られた行を指定する操作を処理することですcutcut/etc/passwd

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

出力にはコロンで区切られたフィールドが含まれます。 GNUには「--output-delimiter」という追加のオプションがあるようですが、次のものを使用することcutもできます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...であることを意味します。 $ 0は通常印刷したい行全体を保存しますが、今回はそうではありません。

sed次のことができます。

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

コマンドはsedついに「ワイルドカード」と出会いますが、この場合は見苦しく見えます。

私のアドバイスはコマンドを好むことですcut。このsed例は、必要なものを取得するための正規表現が見苦しく、正しい結果を得るのが難しいことを示しています。デフォルトでは、トークンを区切るためにスペースが使用されているため、awk以上のことができますcutawkこれにより、フィールド区切り記号の指定を操作するよりも時間が節約されますcut

答え2

read組み込みの機能を使用してください。

while IFS=: read -r user _ uid gid _; do printf "%s\t%s\t%s\n" "$user" "$uid" "$gid"; done </etc/passwd

これにより、必要なフィールドを実際に印刷する前にフィールド区切り文字を設定して:使用し、不要な変数を削除します。_

関連情報