GNU/Linux >> Linux の 問題 >  >> Linux

Bashスクリプト:テキストファイルからデータを読み取る方法

Linux(および一般的なUnixライクなシステム)で私が気に入っているのは、構成とプロパティがテキストファイルに含まれていることです。これにより、適切な権限を持つ管理者が許可されます ファイルを調べて、必要に応じて変更を加えます。テキストファイルもシンプルで便利なデータソースです システム管理者の一般的な操作の場合。特定の状況では、テキストファイルを出力として使用できます。 通常のユーザーとも共有されます。この記事では、両方のケースの例を取り上げます。

stdoutへの書き込み stdinからの読み取り パイプの使用は、仮想テキストファイルの使用に似ています。多くの場合、 テキストファイルがありますが、他の場合は、前のコマンドの出力をテキストファイルであるかのように使用するだけです。

[お楽しみいただけるかもしれません:私のお気に入りの8つの実用的なLinuxコマンド]

では、いつどちらかの方法を使用する必要がありますか?場合によっては、/etc/hostsのようなテキストファイルがすでに存在します。 たとえば、ファイル。それ以外の場合は、結果のみに関心があるため、ファイルを物理的に書き込む必要はありません(データ構造は非常に単純です)。さまざまなシナリオでは、明確さ、トラブルシューティング、監査、または情報の構造やそこにある他の種類のコンテンツを分析できるなどの理由で、情報をファイルに保存する必要がある場合があります。

サーバーのリストの到達可能性と名前解決を確認します

新しいマシンのリストがあり、それらを確認する必要があるとします。

  1. サーバーから到達可能です
  2. 彼らのために名前解決を機能させる
  3. ポート22でリッスンしています(SSH用)

また、スプレッドシート形式で提出する必要があるプロジェクトチームにステータスを報告する必要があります。数十台のサーバーを使用していて、これらのテストを異なる日に繰り返す必要がある場合は、自動化された方法を検討することは間違いなく役立ちます。

入力ファイル

これは、次の例で使用されているCSV(カンマ区切り値)ファイルを取得したスプレッドシートです。

そしてこれはCSVファイルです:

ServerName,IP
m2.example.com,192.168.2.99
xtower.example.com,192.168.2.111
win2k16.example.com,192.168.101.41
control.example.com,192.168.101.200
node1.example.com,192.168.101.201
node2.example.com,192.168.101.202
node3.example.com,192.168.101.203
node4.example.com,192.168.101.204
node5.example.com,192.168.101.205

(スプレッドシートとCSVの変換は手動で行われたため、この記事では取り上げません。)

スクリプト

サーバーのテストに使用するスクリプトは次のとおりです。

1     #!/bin/bash
2     
3     input_file=hosts.csv
4     output_file=hosts_tested.csv
5     
6     echo "ServerName,IP,PING,DNS,SSH" > "$output_file"
7     
8     tail -n +2 "$input_file" | while IFS=, read -r host ip _
9     do
10        if ping -c 3 "$ip" > /dev/null; then
11            ping_status="OK"
12        else
13            ping_status="FAIL"
14        fi
15    
16        if nslookup "$host" > /dev/null; then
17            dns_status="OK"
18        else
19            dns_status="FAIL"
20        fi
21    
22        if nc -z -w3 "$ip" 22 > /dev/null; then
23            ssh_status="OK"
24        else
25            ssh_status="FAIL"
26        fi
27    
28        echo "Host = $host IP = $ip" PING_STATUS = $ping_status DNS_STATUS = $dns_status SSH_STATUS = $ssh_status
29        echo "$host,$ip,$ping_status,$dns_status,$ssh_status" >> $output_file
30    done

次の項目は、上記のスクリプトエントリを説明しています。

6行目: ヘッダーと3つの新しいフィールドを使用して出力ファイルを初期化し、pingを介して到達可能性のステータスを表します。 と名前解決

8行目: whileを使用して入力ファイルを1行ずつ読み取ります 最初の行(ヘッダー)を無視してループします。また、hostとipの変数を作成し、区切り文字(コンマ)を使用して値を抽出し、残りを無視します。

10行目から26行目: pingを実行します 、nslookup 、およびnc コマンド、コマンドからの戻りステータスに関心があるため、出力をnullに送信します

28行目: スクリプトを実行している人の出力をstdoutに送信します

29行目: 3つの新しい列(ping_status、dns_status、ssh_status)を使用してデータを出力ファイルに送信します

出力ファイルをスプレッドシートとして開きます

出力ファイルをワークステーションに送信して、お気に入りのスプレッドシートアプリケーションで開くことができます。これを技術者以外の人に送信する場合は、会社で使用されているデフォルトのスプレッドシート形式で保存して、彼らの生活を楽にすることができます。

[無料のチートシート:サーバーとネットワークを管理するためのLinuxユーティリティとコマンドのリストを入手してください。 ]

まとめ

この記事では、すべてのLinuxシステムで利用できるいくつかの一般的でシンプルなツールを適用して、到達可能性、名前解決、およびSSH経由の接続性のテストを自動化しました。一部のプロジェクトでは、他のチーム(ネットワークやファイアウォールなど)が関与する変更プロセスのために、このタイプの検証を数十台のサーバーに対して実行し、かなりの回数繰り返す必要があります。

原則は、他のタイプのテストに拡張できます。たとえば、別のポートの接続をテストできます。テストがより複雑になった場合(たとえば、SSH経由で到達可能な場合はホストでコマンドを実行する) 、次に、別の種類の問題に対処しているため、別のツールが必要になります。そのような状況では、Ansibleを確認することを強くお勧めします。


Linux
  1. ファイルからテキスト読み取りデータを作成しますか?

  2. ファイルから変数を読み取る方法は?

  3. Linuxでテキストファイルからバイナリを見分ける方法

  1. テキスト ファイルから改行を削除するにはどうすればよいですか?

  2. Bash でテキスト ファイルをコマンドとして実行する

  3. Bashを使用してテキストファイルの最後の行を変数に読み込む方法は?

  1. Linuxでテキストファイルに行番号を追加する方法

  2. Linuxでの偶発的なファイル削除を防止および回復する方法

  3. Linuxでテキストファイルから特定の行を表示するには?