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.