%2C%20%EB%AA%A8%EB%93%A0%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%20%EC%A0%9C%EA%B1%B0%2F%EC%88%A8%EA%B8%B0%EA%B8%B0.png)
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
이는 basename 및 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가 포함되어 있으면 제대로 작동하지 않습니다. 정규식은 먼저 마지막까지 모든 것을 버린 다음 as /
까지 모든 것을 저장합니다 .:
\1
-E
(하위 표현)과 |
슬래시 때문에 사용했습니다 .
하위 표현식은 (.*:)
약간 간단합니다(그리핑된 행에 콜론이 포함되어 있으면 실패함). 콜론을 생략하면 줄에 슬래시가 포함되어 있으면 실패합니다.
이 출력을 보면 나는 이렇게 말합니다.이건 불가능 해이론적으로 (그런 식으로 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
다음 GNU awk
프로그램은 모든 파일 이름에서 작동해야 합니다.
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