単一の列でgrepを実行する方法は?


42

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

grep rahmu列3でのみ実行したいので、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

最も簡単な方法は何ですか?答えは多くのUnixで移植可能でなければならず、できればLinuxとSolarisに焦点を合わせます。

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


5
の出力の解析lsは本質的に脆弱であることに注意してください(ユーザー名に空白が含まれているとどうなるかを考えてください-はい、これは一部のプラットフォームで起こります)。find代わりに使用してください。
ジル 'SO-悪であるのをやめる

これはタイトルの質問には答えませんが、解析を検討する可能性のある場所で便利になる--printfオプションについて言及しstatますls。ただし、通常findは(@Gillesが述べたように)必要なものです。
ワイルドカード

回答:


49

もう一度時間をawk節約してください!

比較的単純な構文を使用して、簡単に実行できます。

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

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

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

9
または:ls -l | awk '$3=="rahmu"'...ちなみに、オープニング(ブラケットはif...の後でなければなりません。awk '{if($3 ...'
Peter.O

3
私から@ Peter.O +1。印刷はawk一致のデフォルトであるため、コマンドはより簡潔で正確です。
-bsd

ローカリゼーションの問題(日付形式が列の順序に影響する)を回避するために、標準形式と言語を確保することがしばしば推奨されますLANG=C ls -l | awk ...
。– fheub


11

列ごとに固定サイズの列を意味する場合、次のことができます。

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

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


2

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

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

「//」で囲まれた部分には、あらゆる種類の正規表現を使用できます。


1

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

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

ディレクトリの場合、任意のタイプのremove に変更-します。d-

基本的に\S\+\s\+、スペース以外の文字とスペース文字が一致する各列を選択するため、最初の3つの列とユーザー名を一致させます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.