次のサンプル/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