С GNU sed
:
sed '1~2 { h; d; }; G; s/\n//'
С awk
:
awk '{ if(NR%2) save = $0; else print $0 save }'
С perl
:
perl -pe '$_ = <> . $_; s/\n//'
Вы правы, что |
передает вывод одной программы в другую. Данные передаются с влево
на вправо
. Таким образом, вы можете подумать, что
pgrep dnsspoof | kill
должен работать, поскольку pgrep
найдет номер процесса dnsspoof и скармливает его kill
, который затем убьет его. Оказывается, это не работает, так как kill смотрит только на командную строку, чтобы получить то, что нужно убить.
Итак, мы должны получить вывод pgrep
в командной строке. Это то, что делает
`pgrep dnsspoof`
или более современный $ (pgrep dnsspoof)
: он запускает команду внутри обратных кавычек или скобок и помещает вывод вместо команды. Итак, если pgrep dnsspoof
выводит 5432
, то тогда выполняется команда kill 5432
, что является правильным способом вызвать программу уничтожения.
Использование $ ()
имеет несколько преимуществ, более легкое вложение, меньше вещей, которые нужно экранировать, поэтому, если ваша оболочка поддерживает их, вам следует использовать их вместо ``
.
Вы правы насчет |
, но вы выполняете команду противоположным образом, вы должны выполнить pgrep dnsspoof
, затем отправить его вывод на вход kill
, но он не принимает их команды на стандартном входе, они ожидают, что они будут прописаны в аргументах к команде, поэтому вам придется использовать xargs
, который читает данные потока STDIN и преобразует каждую строку в аргументы к команде, разделенные пробелами:
pgrep dnsspoof | xargs kill
но в вашем случае вы посылаете вывод команды kill
на вход команды pgrep dnsspoof
, что не имеет смысла