Вы можете передать содержимое файла через ssh
так же, как вы можете передать его через любой другой канал
# Create sample file
cat >>/tmp/file <<'EOF'
apple
banana
cherry
EOF
# Run 'nl' locally
nl </tmp/file
1 apple
2 banana
3 cherry
# Run 'tac' on the remote server 'rserver'
nl </tmp/file | ssh rserver tac
3 cherry
2 banana
1 apple
# Postprocess result locally
nl </tmp/file | ssh rserver tac | grep ana
2 banana
# Tidy up
rm -f /tmp/file
Насколько я понимаю, grep -v "^#" -A 1
означает печатать строки, которые не начинаются с решётки, и по одной строке после каждой. Но разве вы не хотите наоборот, выведите строки, которые действительно начинаются со знака решётки, и одну строку после?
Дан тестовый файл:
#123
echo this
echo this
#456
echo that
echo that
echo that
#789
echo third
grep -A1 ^# history.txt |grep -vxFe --
отпечатки:
#123
echo this
#456
echo that
#789
echo third
Второе grep
заключается в том, чтобы избавиться от разделителей групп grep -A
отпечатков.
В качестве альтернативы uniq history.txt
должен работать для печати только одной из каждого набора последовательных идентичных строк.
с использованием Раку (урожденная Perl6)
Это похоже на работу оператора "flip -flop", доступного в ряде языков сценариев. Ниже приведен ответ с использованием языка программирования Raku (, ранее известного как Perl6 ). Сначала начните с создания более обширного тестового файла :
.$ cat repeated_log.txt
#1596110297_1
A_yadm list -a | xargs -t ls -l
B_yadm list -a | xargs -t ls -l
#1596110297_2
C_yadm list -a | xargs -t ls -l
D_yadm list -a | xargs -t ls -l
E_yadm list -a | xargs -t ls -l
#1596110297_3
F_yadm list -a | xargs -t ls -l
G_yadm list -a | xargs -t ls -l
H_yadm list -a | xargs -t ls -l
I_yadm list -a | xargs -t ls -l
#1596110297_4
#1596110297_5
Теперь для одного -вкладыша, использующего оператор Раку fff
флип -флоп, который реализует поведение «sed -подобное». Захват включается для строк, где первое регулярное выражение видит (в начале -строки -^^
)буквальный символ " #". После включения захват игнорирует первое регулярное выражение и оценивает второе регулярное выражение, отключаясь, когда находит совпадение с отсутствующими строками (в начале -из -строки^^
)a " #" персонаж. «Отрицательное» регулярное выражение реализовано в приведенном ниже коде с использованием <-[#]>
, который является отрицательным «перечислимым классом символов» и реальной особенностью языка Raku :
$ raku -ne '.put if /^^ "#" / fff /^^ <-[#]> /;' repeated_log.txt
#1596110297_1
A_yadm list -a | xargs -t ls -l
#1596110297_2
C_yadm list -a | xargs -t ls -l
#1596110297_3
F_yadm list -a | xargs -t ls -l
#1596110297_4
#1596110297_5
На самом деле, первое регулярное выражение (слева от fff
инфиксного оператора )может быть записано с использованием <+[#]>
, который является положительным «классом нумерованных символов», для более параллельной конструкции:
$ raku -ne '.put if /^^ <+[#]> / fff /^^ <-[#]> /;' repeated_log.txt
#1596110297_1
A_yadm list -a | xargs -t ls -l
#1596110297_2
C_yadm list -a | xargs -t ls -l
#1596110297_3
F_yadm list -a | xargs -t ls -l
#1596110297_4
#1596110297_5
Кроме того, мне кажется, что вы можете улучшить свое регулярное выражение, потребовав совпадения для -или -с началом -строки -"#", за которой следует одна или несколько цифр, т.е. <digit>+
,см. ниже:
$ raku -ne '.put if /^^ <+[#]> <digit>+ / fff /^^ <-[#]> <-digit>+ /;' repeated_log.txt
#1596110297_1
A_yadm list -a | xargs -t ls -l
#1596110297_2
C_yadm list -a | xargs -t ls -l
#1596110297_3
F_yadm list -a | xargs -t ls -l
#1596110297_4
#1596110297_5
[Весь вышеприведенный код удаляет повторяющиеся строки, начинающиеся с B, D, E, G, H и I. Единственная особенность, которую я заметил, заключается в том, что в вашем выводе появятся две последовательные целевые строки, такие как «#1596110297»., но мне не ясно, будет ли ваш входной файл когда-либо содержать такие последовательные строки].