파일에서 문자열을 찾고 그 앞에 "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