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つの方法は、テキストファイル内の文字で区切られた行を指定する操作を処理することですcut
。cut
/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
以上のことができますcut
。awk
これにより、フィールド区切り記号の指定を操作するよりも時間が節約されますcut
。
答え2
read
組み込みの機能を使用してください。
while IFS=: read -r user _ uid gid _; do printf "%s\t%s\t%s\n" "$user" "$uid" "$gid"; done </etc/passwd
これにより、必要なフィールドを実際に印刷する前にフィールド区切り文字を設定して:
使用し、不要な変数を削除します。_