切り取りコマンドはスクリプトのタブ区切りではありません。

切り取りコマンドはスクリプトのタブ区切りではありません。

注:テキストにタブ文字を挿入する方法がわからず、[tab]に置き換えました。

表で区切られたファイル名の値のリストがあります。

host1[tab]ip1
host2[tab]ip2
host3[tab]ip3
host4[tab]ip4

デフォルトの区切り記号cutは[tab]です。

cut -f1 < file
cut -f2 < file

予想通り、ホストとIPを取得しました。しかし、私のスクリプトでは動作しません。

while read line
do
  machine=$(echo $line | cut -f1)
  ip=$(echo $line | cut -f2)
  echo "$machine : is my hostname & $ip : is my @IP"
done < file

実際、行全体を$line変数に入れます。私も大きな成功を収めずに努力しました。

machine=$(echo $line | cut -d$'\t' -f1)
ip=$(echo $line | cut -d$'\t' -f1)

ただし、テーブルをファイルの空白に置き換えてコードを変更すると、次のようになります。

machine=$(echo $line | cut -d' ' -f1)
ip=$(echo $line | cut -d' ' -f1)

期待どおりに動作します。

最初の結果がスクリプト外のCLIで機能するのに、なぜ予想と異なるのか疑問に思います。

私のLinuxバージョン:

Linux yolo 3.13.0-24-generic #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

読んでお手伝いいただきありがとうございます。

ベストアンサー1

cutこの場合、ホスト名とアドレスを削除して直接読み取ることができます。

#!/bin/sh

while read -r machine ip
do
  printf '%s : is my hostname & %s : is my @IP\n' "$machine" "$ip"
done < file

exit 0

おすすめ記事