Linux скрипт bash | как вставить в одну строку

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"
0
21.12.2019, 13:09
3 ответа

Попробуйте использоватьecho -n $line |grep -o -P '(?<=-a).*(?=-d)' >>somefile.txt(Я добавил параметр -n, он должен удалить завершающий символ новой строки, который команда echo добавляет в конец строки ).

-1
28.01.2020, 05:04

Использовать подстановку команд:

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, то аргументы объединяются с пробелом между ними и отправляются на стандартный вывод.

П.С. будьте осторожны при запуске команды из данных, это может сделать вас уязвимым для атаки. Любой, кто предоставляет данные, может выполнить любую команду, которую пожелает.

0
28.01.2020, 05:04

Поскольку у вас есть пары строп, почему бы не соединить их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
0
28.01.2020, 05:04

Теги

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