나는 Linux의 세계에 빠져들고 있으며 직장에서 Linux를 점점 더 많이 사용하고 있습니다 grep
. 이렇게 함으로써 때로는 그것이 내 요구 사항에 충분하지 않다는 것을 알게 되었습니다.
grep
며칠 전에 어려움을 겪고 있었는데 선임 Linux 관리자 중 한 명이 나에게 awk
.
그래서 내 질문은 언제 다른 것보다 하나를 사용하도록 선택합니까? 일을 시작 grep
하고 내가 할 수 있었고 시간을 절약할 수 있었던 많은 시간을 보내기 전에 나 자신에게 어떤 질문을 던질 수 있을까요 awk
?
답변1
sed
및 awk
상위 집합이므로 grep
어떤 작업은 둘 중 하나를 사용하는 것이 더 쉽습니다.
grep foo
sed '/foo/!d'
이는 또는 으로 작성할 수 있지만 awk /foo/
다음을 고려하십시오.
grep -i foo
sed '/[fF][oO][oO]/!d'
GNU 와 같은 것을 고려하고 싶지 않다면 : sed '/foo/I!d'
을 사용 하거나 다시 GNU 확장자: 를 사용하십시오 .awk
awk 'tolower($0) ~ /foo/'
awk -v IGNORECASE=1 /foo/
다양한 도구가 잘하는 것과 다른 도구가 어려움을 겪는 것:
grep
grep
간단한 도구이지만 사용 awk
하거나 재현하기 어려운 매우 특수한 작동 모드를 가지고 있습니다 sed
.
grep -i
대소문자를 구분하지 않는 일치(위 참조)grep -Fe "$string"
고정 문자열 검색에 사용됩니다(export string; awk 'index($0, ENVIRON["string"])'
ANDawk
, AND 와 직접적으로 동등한 것은 없습니다sed
).- (비표준)
grep -r
재귀 검색용 - (비표준)
grep -P
/pcregrep
Perl과 유사한 정규 표현식의 경우(일부sed
구현에서는 Perl과 유사한 정규 표현식을 지원하지만 기본적으로는 지원하지 않음) - (비표준)
grep -o
일치하는 부분을 반환합니다(몇 줄awk
또는sed
동일한 작업 수행). - (비표준) 일치의 컨텍스트를 반환합니다. (역시 사용하기 어렵
grep -A/B/C
거나 유사한 방식 입니다 )sed
awk
sed
s/foo/bar/
:sed
님의 명령에는 다음과 같이s
구현하기 어려운 기능이 있습니다 .awk
s/foo\(.*\)bar/\1/g
:capture (GNU awk에는 확장 기능이 있지만gensub()
)s/foo/bar/3
:각 줄의 세 번째 항목을 바꿉니다.- (비표준): 내부 파일 편집(GNU는
awk
이제 이를 지원하지만).
앗
awk
세 가지 중에서 가장 기능이 풍부한 것입니다.
- 숫자 처리에 적합
- 열 형식의 입력을 처리하는 데 적합합니다.
- 연관 배열은 다양한 소스에서 데이터를 추출하고 결합하는 데 적합합니다.
진주
perl
실용적인 추출 및 보고 도구로서 이러한 모든 도구 중 최고의 기능을 갖추고 있습니다. 이것이 원래 의도된 것입니다( sed
이 모든 것을 쓸모없게 만드는 도구가 됨 awk
).
텍스트 처리를 마스터하면 perl
큰 이점이 있습니다. 덜 일반적인 명령을 살펴보기 전에라도 시간을 들여서 살펴보는 것이 좋습니다 sed
.
성능
경험상 도구가 더 전문화될수록 작업을 더 효율적으로 완료할 수 있습니다. 그러나 이는 구현, 작업 및 기타 몇 가지 요소에 따라 크게 달라지며 성능 상충점이 있을 수 있습니다.
grep
예를 들어, 매우 빠른 일부 구현이 있지만 sed
멀티바이트 문자를 지원하지 않으므로 멀티바이트 로케일의 미국 영어 텍스트에서만 제대로 작동합니다. 또는 작은 고정 길이 버퍼에서 작동하므로 임의의 입력에서는 작동하지 않기 때문에 빠릅니다.