Как передать часть вывода, соответствующего шаблону, в файл, оставив остальное в stdout?

Некоторое время у меня было это в моем ~ / .screenrc :

bind -c pasteline 1 eval copy 'stuff "-Y"' 'paste .'
bind -c pasteline 2 eval copy 'stuff "2-Y"' 'paste .'
bind -c pasteline 3 eval copy 'stuff "3-Y"' 'paste .'
bind -c pasteline 4 eval copy 'stuff "4-Y"' 'paste .'
bind -c pasteline 5 eval copy 'stuff "5-Y"' 'paste .'
bind -c pasteline 6 eval copy 'stuff "6-Y"' 'paste .'
bind -c pasteline 7 eval copy 'stuff "7-Y"' 'paste .'
bind -c pasteline 8 eval copy 'stuff "8-Y"' 'paste .'
bind -c pasteline 9 eval copy 'stuff "9-Y"' 'paste .'
bindkey ¬ command -c pasteline

В основном, набираю ¬ 1 ] изнутри экрана вставляет первую строку над курсором, ¬ 2 вторую строку и так далее.

В моих ~ / .Xdefaults у меня также есть:

XTerm.VT100.translations:             #override\
    Meta <KeyPress> /: dabbrev-expand()

Что позволяет xterm завершить (после Alt + / ) то, что на экране ( глядя назад от позиции курсора).

С помощью zsh при использовании в экране вы можете:

copy-screen() {
  screen -X eval copy 'stuff "-$ H\r"' 'writebuf .lastoutput'
  killring=(${(Oaf)"$(<~/.lastoutput)"})
  CUTBUFFER=$killring[1]
  killring[1]=()
}
zle -N copy-screen
bindkey '\ec' copy-screen

привязать Alt + C к тому виджету, в котором хранятся строки над курсор в вырезанный буфер и кольцо уничтожения (то, что вы вставляете с помощью Ctrl + Y и перебираете с помощью Alt + Y в режиме emacs ). (выше предполагается, что экран был запущен из вашего домашнего каталога).

Если вставленный текст необходимо заключить в кавычки (например, потому что он содержит пробелы или другие специальные символы оболочки), вы можете ввести Alt + " для zsh , чтобы заключить его в кавычки.

В качестве примера вы только что запустили:

$ find /usr/local -size +1M
/usr/local/lib/liblzma.a
/usr/local/share/doc/sudo/ChangeLog
/usr/local/share/perl/5.18.2/Unicode/Unihan/Definition.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/RSKangXi.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRG_TSource.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/HanYu.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/RSUnicode.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRG_GSource.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRGKangXi.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRGHanyuDaZidian.db    

И вы хотите открыть vim в этом sudo ChangeLog выше. При первом подходе вы набираете:

vim ¬9

При втором подходе:

vim /usAlt+/

И повторяйте Alt + / , пока не дойдете до журнала изменений.

При третьем подходе:

vim Alt+CCtrl+YAlt+Y

И повторяйте Alt + Y , пока не дойдете до журнала изменений.

Последний подход можно использовать для запроса $ s1 .

Вместо сохранения в массиве killring сохраните его в массиве (например, $ s ) и используйте $ s [1] для первой строки, $ s [2] для второго ...

copy-screen() {
  screen -X eval copy 'stuff "-$ H\r"' 'writebuf .lastoutput'
  s=(${(Oaf)"$(<~/.lastoutput)"})
}
zle -N copy-screen
bindkey '\ec' copy-screen

Этот Alt + C сохраняет строки над курсором в массиве s .

В любом случае, мы получаем то, что отображается на экране, что не обязательно совпадает с выводом последней команды. Например, printf 'a \ bc \ n' выводит 5 байтов a , BS, c , SPC и LF, но отображает только c .

1
18.07.2017, 00:48
2 ответа

Вот для чего teeвbash:

./a.out | tee >(grep A >fileA) | tee >(grep B >fileB) | grep C >fileC

или еще проще вzsh:

./a.out > >(grep A >fileA) > >(grep B >fileB) > >(grep C >fileC)
1
27.01.2020, 23:18
awk -F':' '$1 ~ "[AB]" { print > $1 } $1 !~ "[AB]" { print > "otheroutput" } ' input

Или, в общем случае, весь ввод будет разделен на основе первого поля:

awk -F':' '{ print > $1 }' input

Используется:

$ cat input
A: abc
B: xyz
A: aaa
A: bbb
B: zzz
C: fff
$ awk -F':' '$1 ~ "[AB]" { print > $1.txt } $1 !~ "[AB]" { print > "otheroutput" } ' input
$ cat A
A: abc
A: aaa
A: bbb
$ cat B
B: xyz
B: zzz
$ cat otheroutput
C: fff
3
27.01.2020, 23:18

Теги

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