2016-05-13 2 views
0

Я запустил некоторую команду, которая генерирует ip-адрес в качестве вывода. Но я разрабатываю рабочий процесс, где мне нужно, чтобы IP-адрес был написан дважды. Ниже приведен пример команды и ее вывод.Как написать вывод команды дважды в файл

$ some command >> out.txt 

$ cat out.txt 
10.241.1.85 
hdfs://10.241.1.236/ 
hdfs://10.241.1.237/ 

То, что я хочу, состоит в дублировании вывода, и оно должно выглядеть следующим образом.

10.241.1.85 
hdfs://10.241.1.236/ 
hdfs://10.241.1.237/ 
10.241.1.85 
hdfs://10.241.1.236/ 
hdfs://10.241.1.237/ 

Любая помощь пожалуйста?

+2

Попробуйте 'var = $ (некоторый cmd); echo -e "$ var \ n $ var" '. –

+1

Я как раз собирался опубликовать это сообщение, однако я сказал бы, что предлагаю вам рассказать больше о рабочем процессе, который нуждается в дублирующих данных в файле. Я бы сказал, что это может улучшить работу с одним экземпляром data .. – Rob

+0

some cmd - огромный, который нельзя назначить переменной. Можете ли вы сказать мне способ, который может дублировать содержимое файла без изменения имени файла? –

ответ

0
some command | tee -a out.txt out.txt 

Или

some command | tee -a out.txt >> out.txt 

Или

some command | tee -a out.txt out.txt >/dev/null 
  1. команда Run

  2. трубы в тройник

  3. Включить режим добавления

  4. Append в тот же файл дважды

+0

Это не дублирует способ, которым хочет OP ... –

1

Решение дается @ott в комментарии кажется прекрасным:

var=$(some cmd); echo -e "$var\n$var". 

Это не назначая команды oÀ varable но он назначает вывод команды переменной.

Если вы не хотите этого, вы можете использовать tee (возможно, это даст какие-то проблемы заказа) или дублировать его по-разному:

some_command > out.txt.tmp 
cat out.txt.tmp out.txt.tmp > out.txt 
rm out.txt.tmp 

Таким образом, вы сначала получаете линии копии после того, как аль линии первых записей. Если вы хотите, чтобы удвоить выход напрямую, вы можете использовать

some_command | sed 'p' > out.txt 
0

Генерировать вывод в какой-то временный, а затем продублировать временный пункт назначения и удалить временный:

some command > /tmp/out.txt; cat /tmp/out.txt /tmp/out.txt > out.txt; rm /tmp/out.txt 
0

Вот еще несколько вариантов вы могли бы поиграть с. Поскольку вывод слишком велик для хранения в переменной, я бы, вероятно, столкнулся с tee, временным файлом и gzip, если скорость записи на диск является узким местом.

someCommand > tmp.txt && cat tmp.txt tmp.txt > out.txt && rm tmp.txt 

Теперь, если диск Скорость чтения/записи является узким местом, вы можете тройник вывод someCommand и перенаправить один из трубопроводов через Gzip изначально.

someCommand | tee >(gzip > tmp.gz) > out.txt && gunzip -c tmp.gz >> out.txt && rm tmp.gz 

Кроме того, если вам не нужны случайные возможности доступа к out.txt и плана по обработке его через какой-то другой трубопровод, вы можете всегда держать его хранить архивированный до тех пор, пока это необходимо.

someCommand | gzip > tmp.gz && cat tmp.gz tmp.gz > out.txt.gz && rm tmp.gz 
0

Я хотел бы предложить следующее:

(someCommand | tee tmp.txt; cat tmp.txt) > out.txt; rm tmp.txt 

Не уверен, что есть способ сделать это безопасно, не прибегая к временному файлу. Вы могли бы захватить его переменной, как некоторые предложили, но вы должны быть осторожны при цитировании, чтобы убедиться, что пробел не искалечен, и вы также можете столкнуться с проблемами, если вывод особенно велик.

Смежные вопросы