複数のコマンドとコマンド置換を使用して配列を埋めるのはお勧めできませんか?

複数のコマンドとコマンド置換を使用して配列を埋めるのはお勧めできませんか?

私は、テクニカルサポートを提供するときに経験の浅い従業員のために情報検索を「中央化」し、単純化するためにbashスクリプトを書いています。

最も深刻なBashスクリプトの観点から、このコードはどのくらい受け入れられますか?簡単に言えば、これは本質的に完全なスクリプトです(実際にはbashシェルです、ハハ)。

#!/bin/bash

declare -a array
array=(`grep -w foo /var/log/bar.log  | awk '{print $1,$2,$3,$14,$16}' | sed 's/<//g; s/>,//g; s/>//g;' | tr [:blank:] , && ssh XXX.XXX.XXX.XXX 'grep -w foo /var/log/bar.log' | awk '{print $1,$2,$3,$14,$16}' | sed 's/<//g; s/>,//g; s/>//g;' | tr [:blank:] ,`)

その後、スクリプトは引き続きアレイの操作を続けます。私がこのように実行するのは、すべてがRAMに保持されることを望むからです。必要に応じて詳しく説明できます。

コードが非常に見苦しいことはわかりますが、目標やプログラミング言語を変更したり、追加のコード行を追加せずにこれを行うためのよりきれいな方法はありますか? sed正規表現を整理できることを知っていますが、現時点ではより良いことを考えることはできません...

ベストアンサー1

はい、たぶん、時には...状況によって異なります。

このような冗談を言って申し訳ありません。質問には、配列の目的と用途、データファイルの内容に関する言及がないため、具体的な内容を話すことは困難です。

要約:いいえ、これはシェルスクリプトでデータを処理する一般的で慣用的な方法ではありません。


書かれたコードは行がかなり長く、理解しにくいです。ほとんどの作業はawk単一のスクリプト(今日は作成しません)で行うことができるようです。私のコードレビューが失敗するのではないかと心配です。

(おそらく)大量のデータを配列に入れたいという事実は、後で1つ以上のシェルループでその配列を処理することになります。単純なループなら、結果をループに直接渡すのはどうでしょうか?

置いてみよう」シェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?」。

コマンドパイプラインが限られた形式(シェルで正しく機能することを保証する単一の単語または文字列)のいくつかのエントリのみを生成する場合、それでも問題はないかもしれませんが、それでも寛容ではありません。

データは特定の時点で読み取る必要があり、配列に保存する手間をかけずにデータを読み取るときに使用することもできます。データとして実行する操作に応じて、またはawksedまたは他のツール)を使用して直接実行できます。

私が理解したのは、カンマで区切られた文字列を生成していることです。おそらく、各行を配列の項目として使用してCSVデータセットを生成するのでしょうか?これは完璧たとえば、awk配列に一時保存せずに再入力します。または、次のいずれかを入力してください。CSVキットこれに関連するツールです。実際のファイルに渡して、1つ以上の他のスクリプトで処理することもできます。

私のように大規模なデータセットで作業している人にとっては、ファイルをシェル変数として読み取ることは不可能です。幸いなことに、ほとんどの標準的なUnixツールはフィルタのように動作し、パイプを使用してプログラムステップ間で約1行ずつデータを渡すことができます。データを「RAM」に読み込んでも速度は向上しません。

私はほとんどいいえファイルのデータをすべてのタイプのシェル変数として読み込みます。私は、配列を送信するよりも配列で単純なパラメータ置換を実行する方が簡単な場合は、静的文字列、寿命の短い一時値、またはカウンタを表すために変数をより頻繁に使用し、静的データを表すために配列を使用します。sed(たとえば、${arr[@]%.*}ファイル名の一部の拡張子を削除)。 )arrまたは短いループでデータを集約するために使用されます。

おすすめ記事