cat
не добавляют новые строки. Новая строка уже присутствует в конце test1
. Это нормально: текстовый файл состоит из последовательности строк, и строка состоит из последовательности печатаемых символов, сопровождаемых символом новой строки. Таким образом все непустые текстовые файлы заканчиваются символом новой строки.
Если у Вас есть два текстовых файла, и Вы хотите связать их вместе, использовать cat
. Вы получите строки первого файла, сопровождаемого строками второго файла.
Если Вы хотите сделать, что-то более сложное, то есть, присоединяется к последней строке первого файла с первой строкой второго файла, Вам нужна более сложная команда. Например, можно лишить последний знак первого файла и добавить второй файл. С GNU coreutils (т.е. на невстроенном Linux), можно сделать это:
{ <test1 head -c -1 && cat test2; } >test3
или на двух шагах:
<test1 head -c 1 >test3 && <test2 cat >>test3
Вот один способ сделать это:
$ for file in ifcfg*; do
num=$(grep IPADDR $file|awk -F. '{print $4}')
sed -e "s/10.1.1.[0-9]\+/10.2.2.$(($num-19))/" $file >tmp/$file
done
Это берет содержание IP-адреса и сокращение это вниз так, чтобы это был 4-й октет, который хранится в переменной $num
. Эта переменная затем добавляется с 19
во время sed
команда. Я должен был развернуть Ваш оригинал sed
немного путем добавления a [0-9]\+
удалить существующий 4-й октет так, чтобы мы могли просто заменить его $num+19
.
У Вас будет лучшая удача при выполнении этого с awk, а не sed.
awk -F. '{printf ("%d.%d.%d.%d\n",$1,$2,$3,$NF-19)}'
или согласно Вашему примеру,
awk -F. '/10.1.1/ {printf ("10.2.2.%d\n",$1,$2,$3,$NF-19)}'
или
for file in ifcfg*
do
awk -F. '/10.1.1/ {printf ("10.2.2.%d\n",$1,$2,$3,$NF-19)}' $file >tmp/$file
done
Сохранить другие строки и принятие этого x
последний элемент на строке, который будет заменен, вот то, что Вы делаете
for file in ifcfg*
do
awk -F. '/10.1.1/ {printf ("%s.%d.%d.%d\n",$1,2,2,$NF-19)}
!/10.1.1/ {print $0}' $file > tmp/$file
done
Я использовал бы жемчуг для этого:
$ grep '10\.' file[123]
file1:10.1.1.29
file2:10.1.1.30
file3:10.1.1.31
$ perl -i -pe 's/10\.1\.1\.(\d+)/ "10.2.2." . ($1 - 19) /ge' file[123]
$ grep '10\.' file[123]
file1:10.2.2.10
file2:10.2.2.11
file3:10.2.2.12
awk 'BEGIN{FS=OFS="."} {$NF -= 19; print $0 > ("tmp/" FILENAME)}' ifcfg*
.
/etc/sysconfig/network-scripts/ifcfg*
? – slm♦ 02.07.2013, 18:23