
ここで愚かな奴 - 私はここで愚かな奴を運営したいのですが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