grep -r(再帰)、すべてのディレクトリを削除/非表示

grep -r(再帰)、すべてのディレクトリを削除/非表示

ここで愚かな奴 - 私はここで愚かな奴を運営したいのですがgrep -r asdf- しかし私のディレクトリに固有の一致だけが欲しいです。(つまり、すべてのディレクトリを無視し、一意の一致のみを表示します。)

だから私は走ったgrep -r asdf | sort --unique。しかし、 - ディレクトリ名が異なるため(dir1/a.txt asdfおよびdir2/a.txt asdf)機能しません。

ディレクトリを除外するオプションは表示されませんgrep -riol(たとえば、試しました)。これは機能の範囲にほとんど意味がないようです。どういうわけか、ディレクトリを切り取り、一致するファイル名+一致のみを表示できますか(おそらく、心/ユニバース曲げ正規表現/sed/...なし)?

答え1

grep基本機能を使用すると、これは可能ではないと思います。

「小さい」正規表現である次のものを使用できます。

grep -r asdf | sed '#^.*/##' | sort --unique

注:検索パターンに次のものが含まれている場合/

答え2

この試み、

grep -r abcd | awk -F ':' '{gsub(/.*\//,"",$1) }1' | awk '!seen[$1]++'
  • gsubディレクトリ構造が削除されます。 (/.*\//,"",$1)最初のフィールド($ 1)では、 '/'が最後に一致する前のすべての(.*)が削除されます。
  • !seen[$1]++ファイル名を一意に指定します。

:注:ディレクトリ名に含めることはできません。

答え3

これはデフォルト名とgrep出力によってグループ化されます。

   ]# grep -ro '#include' include/ |sed -E 's|.*/(.*:)|\1|' |uniq -c |sort|tail -n7
         28 kvm_host.h:#include
         28 mm.h:#include
         29 ib_verbs.h:#include
         31 net_namespace.h:#include
         32 sock.h:#include
         44 fs.h:#include
         48 drmP.h:#include

私は重複したものを得ましたgrep -o。また、スラッシュは省略されました...

名前に:sedが含まれていると正しく機能しません。正規表現は最初に最後まですべてを捨て、次/までのすべて:\1

-Eは理由(サブ式)と|スラッシュを使います。


サブ式は(.*:)少し簡単です(行にコロンが含まれているとgrepは失敗します)。コロンを省略すると、行にスラッシュが含まれていると失敗します。


この出力を見ながら私は言った。それは言わない理論的には(この方法でgrepの出力を解析します):

]# grep -r "" d*
d:/ir:/afile...in file "d"
d:/ir:/afile...in file "ir"

それは同じです。末尾にコロンがあるディレクトリと、名前と内容が重複するファイルが必要です。

]# ls d* 
d

'd:':
ir

grep --color変わって!


このincludeディレクトリは、Linuxカーネルソースコードのディレクトリです。インクルードファイルの完全な行は次のとおりです。

]# grep -rH '#incl' include/linux/aio.h 
include/linux/aio.h:#include <linux/aio_abi.h>

答え4

渡された出力grep --null、次のGNUawkプログラムは、すべてのファイル名で動作する必要があります。

BEGIN {
    # OFS will be printed between
    # each filename and matched line
        OFS = ":"

    # Use null-byte as a record separator
    # to use with output from grep --null
        RS = "\0"

    # Apart from the first record,
    # everything up to the first newline
    # of a record is the matched line from grep
    # Everything after first newline is a filename
        FPAT = "^[^\n]*|\n.*$"

}
NR == 1 {
    # Entire first record
    # is the first filename
    # set `file` to the basename
        file = gensub(".*/","",1)
        next
}
! seen[file, $1]++ {
    # If filename+match
    # not seen, print it
        print file, $1
}
{
    # Get basename of file
    # from next match
        file = gensub(".*/","",1,$2)
}

grep --null -rF asdf . | awk -f see_above.gawk

関連情報