grep для строк не после шаблона

Вы можете передать содержимое файла через 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
0
24.08.2020, 14:49
2 ответа

Насколько я понимаю, 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должен работать для печати только одной из каждого набора последовательных идентичных строк.

0
18.03.2021, 23:12

с использованием Раку (урожденная 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»., но мне не ясно, будет ли ваш входной файл когда-либо содержать такие последовательные строки].

https://raku.org/

0
18.03.2021, 23:12

Теги

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