Linux에서 "/" 기호로 끝나기 전에 txt 줄에 "db" 단어가 포함된 txt 파일에서 첫 번째 단어를 추출합니다.

Linux에서 "/" 기호로 끝나기 전에 txt 줄에 "db" 단어가 포함된 txt 파일에서 첫 번째 단어를 추출합니다.

두 줄이 포함된 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 }'

이는 첫 번째 명령과 매우 유사하지만 이 경우 문장의 세 번째 부분이 필요합니다.

관련 정보