/ etc / passwdファイルを処理して、ホームフォルダが/ homeにあるすべてのユーザーを一覧表示します。

/ etc / passwdファイルを処理して、ホームフォルダが/ homeにあるすべてのユーザーを一覧表示します。

次のサンプル/etc/passwdファイルがあります。

tom:x:1000:1000:Work:/home/tom:/bin/bash
george:x:1000:1000:Work:/home/george:/bin/bash
bla:x:1000:1000:Work:/home/bla:/bin/bash
boo:x:1000:1000:Work:/home/boo:/bin/bash
bee:x:1000:1000:Work:/root/list:/bin/bash

ホームフォルダを持つすべてのユーザーを一覧表示しようとしています/home/

私は書いた

cat ~/Desktop/e.txt |awk -F ":" '{if ($6 ~/^/home/) print $1;}'

e.txtはここにコピーしたテキストです。

バックスラッシュをエスケープ文字として使用するのに問題があることはわかっていますが、コマンドの1行に表示できるようにどのように修正しますか?

答え1

/エスケープを回避するには、正規表現の代わりに引用符を使用できます/

awk -F: '$6 ~ "^/home/" {print $1}' ~/Desktop/e.txt

これによりawk、しばしば{if (foo) ... }justに単純化できますfoo {...}

答え2

次のようにスラッシュを回避できます。

awk -F':' '$6~/^\/home\//{ print $1 }' ~/Desktop/e.txt

その他いたずら複雑なフィールド区切り文字が使用されます。

awk -F'[:/]' '$7=="home"{ print $1 }' ~/Desktop/e.txt
  • -F'[:/]'- とフィールド区切り記号:として両方処理/

答え3

e.txtと仮定すると、ユーザーアカウント情報がLDAPなどで指定された複数の場所に保存される可能性があるため、実際には解析ファイルの代わりに/etc/passwd使用する必要があります。getent passwd/etc/nsswitch.conf

getent passwd | awk -F ':' '$6 ~ "^/home"'

print条件が真の場合、このステートメントは暗黙的に適用されます。ただし、これにより、行全体が印刷されます。これにより、ユーザー名のみが印刷されます。

getent passwd | awk -F ':' '$6 ~ "^/home" {print $1}'

答え4

indexたとえば、grep -F戻り値を使用して文字列の先頭に一致するかどうかを確認するなど、固定文字列の一致にも使用できます。

$ awk -F: 'index($6,"/home/")==1{print $1}' ip.txt
tom
george
bla
boo

または正規表現が必要な場合は、環境変数に渡してください。

$ r='^/home/' awk -F: '$6 ~ ENVIRON["r"]{print $1}' ip.txt
tom
george
bla
boo

関連情報