Awk
раствор:
awk '/<\?xml/{ date=$1 OFS $2 OFS $3 }/rc_transaction result=/{ print date, $2, $7 }' xml.log
Выход:
03 Apr 12:48:42.503 result="ok" sequence_number="117749"
03 Apr 12:49:21.936 result="ok" sequence_number="117750"
03 Apr 12:49:39.654 result="ok" sequence_number="117751"
Попробуйте использоватьecho -n $line |grep -o -P '(?<=-a).*(?=-d)' >>somefile.txt
(Я добавил параметр -n, он должен удалить завершающий символ новой строки, который команда echo добавляет в конец строки ).
Использовать подстановку команд:
echo "$(echo $line |grep -o -P '(?<=-a).*(?=-d)' ) $(echo abc)" >> some_file_to_append_next_line_to
Вам придется изменить 2-ю часть, я изменил ее, чтобы ее можно было протестировать, не запуская команду из данных.
Основная форма:
command4 "$(command1) $(command2)" "$(command3)"
Здесь запускаются command1
и command2
. Их стандартные выходные данные объединяются вместе (с пробелом, так как между ними есть один ). Результат помещается в аргумент 1 из commond4
. Стандарт из command3
используется как аргумент 2 command4
. Затем выполняется command4
.
Если command4
равно echo
, то аргументы объединяются с пробелом между ними и отправляются на стандартный вывод.
П.С. будьте осторожны при запуске команды из данных, это может сделать вас уязвимым для атаки. Любой, кто предоставляет данные, может выполнить любую команду, которую пожелает.
Поскольку у вас есть пары строп, почему бы не соединить ихsed
-одним -лайнером?
Просто направьте вывод через...
sed '$!N;s/\n/ /'
Таким образом, изменив исходный сценарий на:
#!/bin/sh
file=list.txt
cat "$file" | while read line
do
echo $line |grep -o -P '(?<=-a).*(?=-d)'
$line <checkcon.sh # This line can not possibly work...
done | sed '$!N;s/\n/ /' >>somefile.txt
Однако это приведет к некоторым сбоям из-за строки в исходном скрипте, которая не может работать:
me@home:~$./script.sh
./script.sh: 6:./script.sh: cannot open checkcon.sh: No such file
./script.sh: 6:./script.sh: k-opp-: not found
./script.sh: 6:./script.sh: cannot open checkcon.sh: No such file
./script.sh: 6:./script.sh: k-opp-: not found
./script.sh: 6:./script.sh: cannot open checkcon.sh: No such file
./script.sh: 6:./script.sh: k-opp-: not found
me@home:~$ cat somefile.txt
BHHHHH7 BHHHHH8
BHHHHH9
Возможно, вам следует передать $line
в качестве аргумента дляcheckcon.sh
:checkcon.sh "$line"
.
И, конечно же, вывод checkcon.sh
здесь также отсутствует.
С манекеном checkcon.sh
, который выводит вывод на стандартный вывод,все работает как положено:
me@home:~$./script.sh
me@home:~$ cat somefile.txt
BHHHHH7 eth: inet 22.22.222.22
BHHHHH8 eth: inet 222.22.22.22
BHHHHH9 eth: inet 222.222.22.222