Найти строку в файле, а затем найти первую строку выше, содержащую другую строку с помощью bash

Судя по всему, производитель уже выпустил официальный выпуск драйвера, но, насколько я понимаю, никто еще не интегрировал его с Linux, чтобы заставить его работать. URL-адрес исходного кода — https://github.com/fresco-fl2000/fl2000.

0
09.09.2019, 23:06
3 ответа
$ 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, которая содержит запрошенное значение. Если он совпадает, мы печатаем результат.

0
28.01.2020, 02:39

Если вы хотите выполнить поиск по нескольким элементам, вы можете преобразовать весь файл в список записей, доступный для 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
1
28.01.2020, 02:39

Вы можете сделать это с помощью редактора 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
0
28.01.2020, 02:39

Теги

Похожие вопросы