ファイル内の文字列を検索し、その前に「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番目のフィールドがある場合、最初のフィールド$2=="|" { s=$1 }
()の内容をsrv-test-XX
変数に割り当てます。s
|
2番目の部分では、$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