한 줄에 한 단어씩 grep하려고합니다. 각 줄에 대해 grep 단어 이전에 발생하는 모든 내용을 인쇄하고 싶습니다.
예:
echo help.me.nc.example.com is an alias for fd-nc-001.domain.com.
내가 찾고 있는 것은 입니다 .nc
. 그 이전의 모든 내용을 인쇄하고 싶습니다 help.me
.
echo help.me.nc.example.com is an alias for fd-nc-001.domain.com. | awk '{print $6}'
fd-nc-001.domain.com.
echo help.me.nc.example.com is an alias for fd-nc-001.domain.com. | grep .nc | awk '{print $1}'
help.me.nc.example.com
답변1
그러면 문자열이 처음 나타나는 위치에서 입력 줄이 잘립니다 .nc
.
sed 's/\.nc.*//'
(in 안의 점은 .nc
이스케이프 처리해야 합니다. 그렇지 않으면 단일 문자와 일치합니다. .*
이후 \.nc
는 줄의 나머지 부분과 일치합니다.)
또한 입력 줄에 문자열이 포함되어 있지 않으면 아무것도 출력하지 않습니다 .nc
(또는 대체를 수행할 때 무언가만 출력하고 줄에 문자열이 포함되어 있으면 무언가를 출력합니다).
sed -n 's/\.nc.*//p'
이 -n
옵션은 sed
각 주기가 끝날 때 버퍼의 기본 출력을 비활성화합니다. 대신, p
교체 명령에 추가된 플래그는 교체가 트리거될 때마다 명시적인 출력을 수행합니다.
예:
$ echo help.me.nc.example.com is an alias for fd-nc-001.domain.com. | sed 's/\.nc.*//'
help.me
$ echo help.me.XX.example.com is an alias for fd-nc-001.domain.com. | sed 's/\.nc.*//'
help.me.XX.example.com is an alias for fd-nc-001.domain.com.
$ echo help.me.nc.example.com is an alias for fd-nc-001.domain.com. | sed -n 's/\.nc.*//p'
help.me
$ echo help.me.XX.example.com is an alias for fd-nc-001.domain.com. | sed -n 's/\.nc.*//p'
(마지막 명령에는 출력이 없습니다.)
sed -n 's/\.nc.*//p'
다음을 사용하는 것과 동일한 작업을 수행합니다 awk
.
awk 'sub(/\.nc.*/, "")'
(모든 줄에서 대체를 수행하려고 시도하지만 sub()
명령에 사용된 패턴이 일치하는 경우에만 결과를 인쇄합니다.)
같은 일이지만 다음만 사용합니다 pcre2grep
.
pcre2grep -o '.*?(*positive_lookahead:\.nc)'
(줄의 시작 부분과 문자열을 제외한 모든 항목과 일치합니다 .nc
.)
위 의 대신 (*pla:
, 또는 더 비밀스럽게 를 사용할 수 있습니다 . GNU가 있는 경우 이전 명령에서 대신 사용할 수 있습니다 .(?=
(*positive_lookahead:
grep
grep -P
pcre2grep
답변2
.nc
나는 당신이 정말로 원하는 것이 줄 뒤나 끝에서 찾는 것이고 .
, 각 줄에서 문자가 처음 나타나는 부분(마지막 부분이 아닌)을 일치시키려는 것이라고 생각합니다. 이는 그 중 하나입니다(예제 입력을 사용하여 .nc
하위 문자열이 아닌 입력에 한 번 나타나는 경우 보다 더 많은 것을 테스트함 ).
$ echo 'help.ncc1701.nc.foo.nc.com' | sed -E 's/\.nc(\..*|$)//'
help.ncc1701
$ echo 'help.ncc1701.nc.foo.nc.com' | awk 'sub(/\.nc(\..*|$)/,"")'
help.ncc1701
sed 명령은 -E
GNU 또는 BSD sed와 같은 ERE 지원 sed를 지원해야 하며 awk 명령은 모든 awk에서 작동합니다.