Вы можете использовать sshfs
для монтирования удаленной машины как локального каталога в вашей виртуальной машине и просматривать, копировать и редактировать файлы на удаленной машине.
Синтаксис используется следующий
sshfs remote_user@remote_computer:/full/path/to/directory /path/to/local/directory
Вы можете сделать это с помощью Awk, установив для переменной «Разделитель записей» регулярное выражение, соответствующее как минимум двум последовательным символам новой строки:
awk -v RS='\n\n+' '/1.*2.*3/' file.txt
Вы также можете установите «Разделитель полей» на один символ новой строки:
awk -v RS='\n\n+' -F '\n' '$1 == "LINE OF TEXT 1" && $2 == "LINE OF TEXT 2" && $3 == "LINE OF TEXT 3"' file.txt
Разбито для удобства чтения:
awk -v RS='\n\n+' -F '\n' '
$1 == "LINE OF TEXT 1" &&
$2 == "LINE OF TEXT 2" &&
$3 == "LINE OF TEXT 3"
' file.txt
С вашим требованием печатать имя файла только при обнаружении совпадения, вы можете сделать это следующим образом:
awk -v RS='\n\n+' -F '\n' '
$1 == "LINE OF TEXT 1" &&
$2 == "LINE OF TEXT 2" &&
$3 == "LINE OF TEXT 3" {
match++
}
END {
if (match) {
print FILENAME
}
' file.txt
Но учитывая вы говорите о с использованием find
в сочетании с awk
, я бы рекомендовал просто использовать Awk для статуса выхода и использовать find
для печати:
find . -type f -exec awk -v RS='\n\n+' -F '\n' '
$1 ~ /LINE OF TEXT 1/ &&
$2 ~ /LINE OF TEXT 2/ &&
$3 ~ /LINE OF TEXT 3/ {
exit 0
}
END { exit 1 }
' {} \; -print
Таким образом, если вы хотите сделать что-то else перед печатью (какой-нибудь другой найти
первичный), вы уже настроены для этого.
Вы можете сделать это, используя дуэт find <-> perl, работающий в тандеме, например:
find . -type f -exec \
perl -l -0777ne '/^LINE.* 1\nLINE.* 2\nLINE.* 3$/m && print $ARGV' {} +
Вы можете использовать «режим абзаца» в Perl, он будет читать файл по блокам разделены несколькими символами новой строки. Просто установите пустую строку в качестве разделителя входных записей $ /
:
perl -lne 'BEGIN { $/ = "" }
$found = 1 if /^LINE.* 1\nLINE.* 2\nLINE.* 3$/m;
if (eof) { print $ARGV if $found; undef $found }
' -- file1 file2...
eof
истинно в конце каждого файла $ ARGV
- это имя текущего открытого файла.