tra-loi-cau-hoi-phat-trien-web.com

Bash làm việc với tôi

Tôi đã thực thi một lệnh trong bash để lấy một số địa chỉ từ một tệp như thế này:

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

sản lượng:

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

và tôi muốn nối 'eth0' vào từng dòng đầu ra và sau đó lý tưởng cho vòng lặp trên kết quả để gọi một lệnh với mỗi dòng. Vấn đề tôi gặp phải là nhận được chuỗi bổ sung đó ở cuối mỗi dòng. Tôi đã thử:

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

mà không hoạt động..và sau đó giả sử tôi đã có nó ở đó, nếu tôi bọc nó trong một vòng lặp for thì nó sẽ không vượt qua trong dòng đầy đủ vì chúng chứa khoảng trắng. Vì vậy, làm thế nào để tôi đi về điều này?

9
Palace Chan

Bạn có thể khớp $ để nối vào một dòng, như:

sed -e 's/$/ eth0/'

CHỈNH SỬA:

Để lặp lại các dòng, tôi khuyên bạn nên sử dụng vòng lặp while, như:

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

Còn về việc sử dụng awk:

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

Bản giới thiệu:

$ 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

Hoặc chỉ với sed:

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

Tất cả bạn cần là:

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

Luôn sử dụng IFS = và -r khi sử dụng read trừ khi bạn có lý do rất cụ thể. google vì sao.

2
Ed Morton
typeset TMP_FILE=$( mktemp )
touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/stringToAdd/' "${TMP_FILE}" > filename
0
pedram bashiri

cái này có ổn với bạn không?

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 bạn có thể hợp nhất phần cắt, tr (thậm chí grep trong ví dụ của bạn) vào một lệnh gọi sed/awk, để làm cho cmdline đơn giản và nhanh hơn.

0
Kent

Tôi đến đây để tìm kiếm câu trả lời tương tự, nhưng không ai ở trên làm điều đó sạch sẽ như

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

Tìm kiếm và thay thế nội tuyến bằng sed cho các dòng bắt đầu bằng địa chỉ, thay thế bằng cùng một dòng cộng với 'eth0'

ví dụ.

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
0
Calvin Taylor