Bash как добавить слово к концу строки?

Я выполнил команду в bash для извлечения некоторых адресов из файла следующим образом:

grep address file.txt | cut -d'=' -f2 | tr ':' ' '

дает:

xxx.xx.xx.xxx port1
xxx.xx.xx.xxx port2

и я хотел бы добавить 'eth0' к каждой из этих выходных строк, а затем идеально для цикла по результату для вызова команды с каждой строкой. Проблема, с которой я столкнулась, - это получить дополнительную строку в конце каждой строки. Я пробовал:

| sed -e 's/\(.+)\n/\1 eth0/g'

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

Ответ 1

Вы можете сопоставить $, чтобы добавить к строке, например:

sed -e 's/$/ eth0/'

EDIT:

Чтобы перебрать строки, я бы предложил использовать цикл while, например:

while read line
do
  # Do your thing with $line
done < <(grep address file.txt | cut -d'=' -f2 | tr ':' ' ' | sed -e 's/$/ eth0')

Ответ 2

Как использовать только awk:

awk -F= '/address/{gsub(/:/," ");print $2,"eth0"}' file

Демо:

$ cat file
junk line
address=192.168.0.12:80
address=127.0.0.1:25
don not match this line

$ awk -F= '/address/{gsub(/:/," ");print $2,"eth0"}' file
192.168.0.12 80 eth0
127.0.0.1 25 eth0

Или просто с sed:

$ sed -n '/address/{s/:/ /g;s/.*=//;s/$/ eth0/p}' file
192.168.0.12 80 eth0
127.0.0.1 80 eth0

Ответ 3

Все, что вам нужно, это:

awk -F'[=:]' '{print $2, $3, "eth0"}' file.txt |
while IFS= read -r ip port eth
do
   printf "ip=%s, port=%s, eth=%s\n" "$ip" "$port" "$eth"
done

Всегда используйте IFS = и -r при чтении, если у вас нет особых причин. google для почему.

Ответ 4

typeset TMP_FILE=$( mktemp )
touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/stringToAdd/' "${TMP_FILE}" > filename

Ответ 5

Я пришел сюда в поисках того же ответа, но ни один из вышеперечисленных не делает это так чисто, как

sed -i 's/address=.*/& eth0/g' file

Найдите и замените inline на sed для строк, начинающихся с адреса, замените на ту же строку плюс 'eth0'

например.

sed -i 's/address=.*/& eth0/g' file; cat file
junk line
address=192.168.0.12:80 eth0
address=127.0.0.1:25 eth0
don not match this line

Ответ 6

это нормально для вас?

kent$ echo "xxx.xx.xx.xxx port1
xxx.xx.xx.xxx port2"|sed 's/.*/& eth0/'
xxx.xx.xx.xxx port1 eth0
xxx.xx.xx.xxx port2 eth0

P.S вы можете объединить вырез, tr (даже grep в вашем примере) в один вызов sed/awk, чтобы упростить и ускорить cmdline.