web-dev-qa-db-ja.com

単一の列でgrepを実行するにはどうすればよいですか?

ls -lコマンドの出力をgrepしたい:

-rw-r--r--   1 root root       1866 Feb 14 07:47 rahmu.file
-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

$ 3列のみでgrep rahmuを実行したいので、grepコマンドの出力は次のようになります。

-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

それを行う最も簡単な方法は何ですか?答えは、できればLinuxとSolarisに重点を置いて、多くのUnices間で移植可能でなければなりません。

注:特定のユーザーに属するすべてのファイルを見つける方法を探しているわけではありません。この例は、質問をより明確にするためにのみ提供されています。

43
rahmu

もう一度awkで一日を節約できます!

これは、比較的単純な構文を使用した簡単な方法です。

ls -l | awk '{if ($3 == "rahmu") print $0;}'

またはさらに簡単:(コメントのPeter.Oに感謝)

ls -l | awk '$3 == "rahmu"' 
50
rahmu

特定の列の文字列の一部のみを照合する場合は、 https://stackoverflow.com/questions/17001849/awk-partly-string-match-if-column-partlyからのアドバイスを使用できます-matches

some_command | awk '$6 ~ /string/'
17
Colin D

列ごとの場合、固定サイズの列を意味します。

ls -l | grep "^.\{15\}rahmu"

どこ ^は行の始まりを意味し、.は任意の文字を意味し、\{15\}は、直前の文字(この場合は任意の文字)がちょうど15回出現することを意味します。

11
jfg956

私はパーティーに遅れていることを知っていますが、この問題の非常に一般的な解決策は、次のような正規表現でawkを使用することです。

awk '$3~/rahmu/{print}' input_file

「//」で囲まれた部分は、任意の種類の正規表現にすることができます。

2
PejoPhylo

単一のユーザー名の列に基づいてgrep(およびファイルのみを印刷)するには、次のことを試してください。

ls -la | grep "^-\S\+\s\+\S\+\s\+rahmu"

ディレクトリの場合、-dに変更します。すべてのタイプで、-を削除します。

基本的には、各列を\S\+\s\+で選択します。これは、非スペース文字とそれに続くスペース文字と一致するため、最初の3つの列とユーザー名を照合します。

1
kenorb