일부 패턴을 제외하고 grep하는 방법?
일부 패턴이 발생하고 다른 패턴이없는 파일에서 줄을 찾고 싶습니다. 예를 들어, 내가 포함한 모든 파일 / 라인을 찾을 필요 loom
와 제외한를 gloom
. 따라서 loom
명령으로 찾을 수 있습니다 .
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
loom
이제을 제외하고 검색 하고 싶습니다 gloom
. 그러나 다음 두 명령이 모두 실패했습니다.
grep -v 'gloom' -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
grep -n 'loom' -v 'gloom' ~/projects/**/trunk/src/**/*.@(h|cpp)
목표를 달성하려면 어떻게해야합니까?
편집 1 : 난 그 의미loom
와gloom
문자 시퀀스 (반드시 단어가) 있습니다. 따라서 예를 들어bloomberg
명령 출력에 필요하고ungloomy
.
편집 2 : 내 기대치의 샘플이 있습니다. 다음 두 줄은 모두 명령 출력에 있습니다.
나는 향의 베일을 통해 어렴풋이 보이는 아이콘을 마주했다 .
Arty는 우울한 날에 어둡 습니다 .
다음 줄은 모두 명령 출력에 없습니다.
그것은이다 'gloomyin cloods - 오 좋은 muckle doolders 심고 끔찍한'.
heigh pyntit 홀의 남서쪽 라운드에서
그립을 연결하는 것은 어떻습니까?
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
체인이없는 또 다른 솔루션 grep
:
egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
줄의 첫 번째 문자가 아닌 경우 대괄호 사이에서를 표시 g
하기 전에 문자를 제외합니다 .loom
loom
조금 늙었지만 오 글쎄 ...
@houbysoft에서 가장 많이 투표 한 솔루션은 "loom"이 있더라도 "gloom"이 포함 된 라인을 제외하므로 작동하지 않습니다. OP의 기대에 따라 "loom"이 포함 된 라인도 포함해야합니다. 이 라인은 "Arty is slooming in a darky day."라는 출력에 있어야합니다. 그러나 이것은 다음과 같은 체인 된 grep에 의해 제외됩니다.
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
대신 Bentoy13 의 egrep regex 예제가 더 잘 작동합니다.
egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
"gloom"이 있는지 여부에 관계없이 "loom"이있는 모든 줄이 포함됩니다. 반면에 어둠 만 있다면 포함하지 않을 것입니다. 이는 OP가 원하는 행동입니다.
awk를 사용하면 복합 조건을 명확하게 표현할 수있는 grep보다 훨씬 간단합니다.
loom
및 gloom
다음을 모두 포함하는 줄을 건너 뛰려면
awk '/loom/ && !/gloom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)
또는 인쇄하려는 경우 :
awk '/(^|[^g])loom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)
그리고 현실이 loom
그 자체로 단어 로 나타나는 줄을 원하면 :
awk '/\<loom\>/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)
-v
"inverted match"플래그이므로 파이핑은 매우 좋은 방법입니다.
grep "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)| grep -v "gloom"
/ * 당신은 이런 식으로 보일 수 있습니까?
grep -vn "gloom" `grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)`
BACKQUOTES는 명령의 대괄호처럼 사용되므로이 경우 -l
활성화 된 경우 BACKQUOTES의 코드는 파일 이름을 반환 한 다음 -vn을 사용하여 원하는 작업을 수행합니다. 파일 이름, 줄 번호 및 실제 줄도 있습니다.
업데이트 또는 xargs 사용
grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp) | xargs grep -vn "gloom"
도움이되기를 바랍니다. * /
내가 위에 쓴 것을 무시하십시오. 쓰레기입니다.
grep -n "loom" `grep -l "loom" tt4.txt` | grep -v "gloom"
#this part gets the filenames with "loom"
#this part gets the lines with "loom"
#this part gets the linenumber,
#filename and actual line
grep -P
지원되는 (perl regex) 사용할 수 있습니다 negative lookbehind
.
grep -P '(?<!g)loom\b' ~/projects/**/trunk/src/**/*.@(h|cpp)
\b
단어 경계를 추가 했습니다.
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
Simply use! grep -v
multiple times.
Content of file
[root@server]# cat file
1
2
3
4
5
Exclude the line or match
[root@server]# cat file |grep -v 3
1
2
4
5
Exclude the line or match multiple
[root@server]# cat file |grep -v 3 |grep -v 5
1
2
4
Question: search for 'loom' excluding 'gloom'.
Answer:
grep -w 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
참고URL : https://stackoverflow.com/questions/18468716/how-to-grep-excluding-some-patterns
'Development Tip' 카테고리의 다른 글
로그 스케일 및 사용자 지정 나누기가있는 히스토그램 (0) | 2020.10.26 |
---|---|
파이썬을 사용하여 파일에서 한 번에 두 줄을 읽는 방법 (0) | 2020.10.26 |
임시 변수가 내 프로그램을 느리게합니까? (0) | 2020.10.26 |
중괄호가있는 Javascript (ES6) const (0) | 2020.10.26 |
숫자를 포함 할 수있는 문자열을 기준으로 정렬 (0) | 2020.10.26 |