두 줄이 포함된 abc.txt 파일이 있습니다. db
특정 줄의 단어가 포함된 줄의 첫 번째 단어를 추출하고 싶습니다 .
abc.txt:
XYZ/db_abc.sql
ijkl/tables/table_name/tl_abc.sql
grep을 시도하면 grep "db" abc.txt
"db"가 포함된 행이 표시되지만 첫 번째 단어를 출력으로 추출하고 싶습니다 XYZ
.
산출:
$ grep "db" abc.txt
XYZ/db_abc.sql
예상 출력:
XYZ
마찬가지로 grep을 시도하면 grep "tl" abc.txt
"tl"이 포함된 줄이 표시되지만 세 번째 단어를 출력으로 추출하고 싶습니다 table_name
.
산출:
$ grep "tl" abc.txt
ijkl/tables/table_name/tl_abc.sql
예상 출력:
table_name
답변1
$ awk -F / -v q=db '$0 ~ q { print $(NF-1) }' file
XYZ
$ awk -F / -v q=tl '$0 ~ q { print $(NF-1) }' file
table_name
두 awk
명령은 동일하지만 서로 다른 표현식을 쿼리하기 위해 서로 다른 매개 변수가 제공됩니다. 명령줄의 변수에 할당된 awk
문자열은 q
확장 정규식으로 사용되며 지정된 파일의 모든 줄과 일치됩니다. 표현식이 한 줄과 일치하면 끝에서 두 번째 필드가 인쇄됩니다. 이는 특수 변수 NF
(현재 행의 필드 번호)를 사용하여 두 번째 필드( )의 필드 번호를 계산함으로써 NF-1
수행 됩니다. 이 유틸리티는 필드를 슬래시로 구분합니다( 를 사용하여 표시됨 -F /
).
이를 변형하면 쿼리 패턴이 마지막 필드에서만 일치하도록 보장됩니다.
awk -F / -v q=tl '$NF ~ q { print $(NF-1) }' file
또한 다음으로 끝나는 줄에만 관심이 있는지 확인하세요 .sql
.
awk -F / -v q=tl '/\.sql$/ && $NF ~ q { print $(NF-1) }' file
답변2
grep이 기본적으로 작동하는 방식이므로 전체 행을 반환합니다. 문장의 특정 부분을 추출하려면 정규식을 사용하는 것이 좋습니다.
문장을 추출하려면 XYZ
다음과 같이 구성된 정규식을 사용할 수 있습니다.
grep -oP ".*(?=/db) abc.txt"
-o
패턴과 일치하는 행만 반환하는 것입니다.
-P
패턴을 검색하는 데 사용됩니다 Perl Regex
.
.*
다음을 제외한 모든 문자를 검색하세요.\n
(?=/db)
문자열 뒤의 모든 항목을 일치시키려고 /db
하지만 문자열 자체에 도달하면 일치를 중지한다고 말할 것입니다. 의미, 제외 /db
및 그 이상의 모든 것.
마찬가지로 찾기 위해서는 table_name
유사한 접근 방식을 적용해야 합니다. 다음과 같은 정규식을 사용할 수 있습니다.
grep -oP "(?<=tables/).*(?=/tl) abc.txt"
이는 이전 grep과 다소 유사하지만 이번에는 grep이 이전과 이후의 모든 항목을 (?<=tables/)
반환하도록 지시하기 위해 이를 추가했습니다 .tabels/
/tl
awk
정규식을 사용하고 싶지 않다면 명령을 사용하여 이를 수행할 수도 있습니다.
검색하려면 XYZ
다음을 사용할 수 있습니다.
grep "db" abc.txt | awk -F '/' '{ print $1 }'
따라서 이 경우 grep
명령은 전체 줄을 반환하지만 awk
구분 기호를 사용하여 줄을 분할 /
하고 분할 줄의 첫 번째 부분을 반환합니다.
검색하려면 table_name
다음을 수행할 수 있습니다.
grep "tl" abc.txt | awk -F '/' '{ print $3 }'
이는 첫 번째 명령과 매우 유사하지만 이 경우 문장의 세 번째 부분이 필요합니다.