첫 번째 단어가 $var이면 처음 두 단어를 제외한 전체 줄을 인쇄합니다.

첫 번째 단어가 $var이면 처음 두 단어를 제외한 전체 줄을 인쇄합니다.

아래와 같은 로그 파일이 있습니다.

130023432 195047 /media/ismail/SSDWorking/book-collection/_Books/book 1.epub
130023433 195047 /media/ismail/SSDWorking/book-collection/_Books/book 2.epub
130023431 195047 /media/ismail/SSDWorking/book-collection/_Books/book 3.epub

변수가 있는데,var=130023432

$var첫 번째 단어가 다음과 같으면 처음 두 단어를 제외한 모든 단어를 인쇄하고 싶습니다 .

따라서 이 경우 출력은 다음과 같습니다.

/media/ismail/SSDWorking/book-collection/_Books/book 2.epub

지금까지 시도했지만 grep -oP "(?<=$var \d+ ).*$'"오류가 발생했습니다.grep: lookbehind assertion is not fixed length

어떻게 해야 하나요?

답변1

다음 짧은 awk( subsed: 대체 패턴 또는 정규 표현식)을 사용하세요.

var=130023432 awk -v var="$var" '$1==var{sub($1" "$2" ", ""); print}' file

또는 간단하게:

awk -v var="130023432" '$1==var{sub($1" "$2" ", ""); print}' file

/media/ismail/SSDWorking/book-collection/_Books/book 1.epub

답변2

awk이런 목적 으로 사용할 수 있습니다 .

var="$var" awk '$1 == ENVIRON["var"] { $1 = $2 = ""; print substr($0, 3) }' logfile

예제 출력 사용

/media/ismail/SSDWorking/book-collection/_Books/book 1.epub

환경 변수는 변경되지 않은 상태에서 백슬래시 등의 값이 처리되기 awk -v var="$var" '...'}때문에 해당 구성을 피했습니다 . -v정말로 이 길을 가고 싶다면 다음을 시도해 보세요(POSIX 아님).

awk -v var="${var//\\/\\\\}" '$1 == var { $1 = $2 = ""; print substr($0, 3) }' logfile

답변3

sed

$ sed -En "s~$var[^/]*(.*)~\1~p" input_file

pcregrep

$ pcregrep -o1 "$var[^/]*(.*)" input_file

grep

$ grep -oP "$var[^/]*\K.*" input_file

awk

$ awk -v var="$var" '$1==var {print $(NF-1),$NF}' input_file

산출

/media/ismail/SSDWorking/book-collection/_Books/book 1.epub

관련 정보