it-swarm-ja.com

'grep'の後の変数と文字列を連結します

これが私のファイルの構造です:

g-4.n.g.fr 10.147.243.63 g-4.n.g.fr-w1

これが私のスクリプトです:

 #! /bin/sh
 ip=10.147.243.63
 worker=$(grep -e $ip $1 | awk '{ print $3; }')
 echo "[Hostname: ]"
 echo $worker
 echo "[Before concat]"
 echo $worker
 echo "[After concat]"
 echo "$worker.v.1"

私はこの出力を持っています:

[Hostname: ]
g-4.n.g.fr-w1
[Before concat]
g-4.n.g.fr-w1
[After concat]
.v.1n.g.fr-w1

次のように、.v.1の後にg-4.n.g.fr-w1を置換せずに使用したい。

g-4.n.g.fr-w1.v.1

この出力を持つようにスクリプトを変更するにはどうすればよいですか?

1
researcher

弦やその一部で遊んだときの奇妙な結果

まず、行末をテストします。

$ file test.txt
test.txt: ASCII text, with CRLF line terminators

上記を取得し、実際にDOS行末が必要ない場合は、 dos2unix ツールを使用できます。

$ dos2unix test.txt
dos2unix: converting file test.txt to Unix format ...
$ file test.txt
test.txt: ASCII text

さて、一貫した形式で私のデータを取得しました

スクリプトは、多かれ少なかれ意図したとおりに機能するはずです(ここでは機能します)。

[Hostname: ]
g-4.n.g.fr-w1
[Before concat]
g-4.n.g.fr-w1
[After concat]
g-4.n.g.fr-w1.v.1

それでも問題が解決しない場合は、次のことを試してください。

printf "%s.v.1" "$worker"

スクリプトを変更して、ファイル内の文字列を検索するためにgrepを使用していることを明確にし、 Bashの落とし穴 に従ってプレーンなecho $varsを削除することをお勧めします。

ip="10\.147\.243\.63"
worker=$(grep -e $ip $1 | awk '{ print $3; }')
printf "[Hostname: ]\n"
printf '%s\n' "$worker"
printf "[Before concat]\n"
printf '%s\n' "$worker"
printf "[After concat]\n"
printf '%s.v.1\n' "$worker"
1
bertieb