파일에서 문자열을 찾은 다음 bash를 사용하여 다른 문자열이 포함된 위의 첫 번째 줄을 찾습니다.

파일에서 문자열을 찾은 다음 bash를 사용하여 다른 문자열이 포함된 위의 첫 번째 줄을 찾습니다.

파일에서 문자열을 찾고 그 앞에 "srv"가 포함된 줄의 첫 번째 인스턴스를 찾으려면 어떻게 해야 합니까?

나는 Tac과 sed를 조사해 왔지만 제대로 작동하지 못했습니다.

검색할 출력 파일은 다음과 같습니다.

srv-test-1 | SUCCESS | rc=0 >>
a1
A3
srv-test-2 | SUCCESS | rc=0 >>
a1
b1
b2
B3
B4

코드는 사용자에게 찾고 있는 문자열을 묻는 메시지를 표시하고 이를 변수에 저장합니다.

다음을 사용하여 사용자 요청을 찾을 수 있습니다.

tac file | grep $requested

사용자가 b1을 요청하면 반환되기를 원합니다.

b1 found on srv-test-2

마찬가지로 a1이 요청되면 반환됩니다.

a1 found on srv-test-1
a1 found on srv-test-2

답변1

여러 항목을 검색하려는 경우 전체 파일을 grep 가능한 항목 목록으로 변환할 수 있습니다.

awk '/^srv/ { c = $1 ; next } { print $0 " found on " c }'

입력 파일은 다음을 제공합니다.

a1 found on srv-test-1
A3 found on srv-test-1
a1 found on srv-test-2
b1 found on srv-test-2
b2 found on srv-test-2
B3 found on srv-test-2
B4 found on srv-test-2

그런 다음 단일 항목을 검색하려면 이전 출력을 필터링할 수 있습니다.

awk '/^srv/ { c = $1 ; next } { print $0 " found on " c }' | grep '^a1'

주다

a1 found on srv-test-1
a1 found on srv-test-2

답변2

$ requested='a1'; awk '$2=="|" { s=$1 }; $1==r { print r" found on "s }' r="$requested" file
a1 found on srv-test-1
a1 found on srv-test-2

첫 번째 부분은 두 번째 필드가 이면 $2=="|" { s=$1 }첫 번째 필드()의 내용을 srv-test-XX변수에 할당합니다.s|

두 번째 부분에서는 $1==r { print r" found on "s }첫 번째 필드를 r요청된 값이 들어 있는 변수와 비교합니다. 일치하는 항목이 있으면 결과를 인쇄합니다.

답변3

sed다음과 같이 편집기를 사용하여 이 작업을 수행 할 수 있습니다 .

str='a1';          #string to search
str_esc_lhs=$(printf '%s\n' "$str" | sed -e 's:[][\/.^$*]:\\&:g');# escaped var fit for use on the lhs 
S='[^[:blank:]]'; #regex for a nonwhitespace char

$ sed -e "
   /srv/,/${str_esc_lhs}/!d
   H;/srv/h;/${str_esc_lhs}/!d
   g;/./!d
   s/\\(srv-$S*\\).*\\n\\(.*\\)/\\2 FOUND ON \\1/
" input_file.txt

관련 정보