Kshスクリプトでgrep変数を使用する方法

Kshスクリプトでgrep変数を使用する方法
#!/bin/ksh
Temp=Kerala
cs1=`grep "$Temp" State_list.txt | awk '{print $NF}'`
echo $cs1 #("Not seeing output KL":

次のようにコードを変更すると機能します。

cs1=`grep "Kerala" State_list.txt | awk '{print $NF}'`

...しかし、変数として渡したいです。

State_List.txt ファイルは次のとおりです。

Karnataka KAR
TamilNadu TN
Kerala    KL

ベストアンサー1

この問題はコメントセクションで解決されました。

要約:

これらのファイル(スクリプトファイルとデータファイルを含む)はDOSテキストファイルです。 Unixでは、\r各行の末尾に追加(キャリッジリターン)文字があることを意味します。

スクリプトの場合、これは変数の割り当てを意味します。

Temp=Kerala

Kerala\r変数に値を割り当てますTemp。データファイルには値が含まれていないため、見つかりません。

変数の代わりに挿入された値を使用してスクリプトを実行すると、データの適切な場所にあるDOSテキストの問題の影響を受けないため、機能します。

両方のファイルにユーティリティをインストールして実行し、それがdos2unixUnixテキストファイルであることを確認する必要があります。また、見ることができますこのサイトに関するその他の質問このユーティリティに関連しています。


スクリプトは次のように書くこともできます。

#!/bin/sh

Temp='Kerala'
cs1=$( awk -v pattern="$Temp" '$1 ~ pattern { print $NF }' State_list.txt )
printf '%s\n' "$cs1"

これは削除され、grepその場でawkデータ内のファイルの最初の列pattern(コマンドラインに割り当てられた変数)を含むすべての行を取得するために使用されます。正規表現のマッチングではなく正確な文字列マッチングを実行するには、その場で$Temp使用してください。==~

このスクリプトはsh(そして元のスクリプトも)特別なksh機能を使用しないので、スクリプトです。

おすすめ記事