user-pid.out2
「ユーザーID」と「プロセスID」の2つの列で構成されるファイルがあります。ユーザー番号に基づいて対応するプロセスIDを見つけたいと思います。下の最初の2行は正しい出力を示していませんが、3行と4行でユーザーを62にハードコードすると、ユーザー62に対応するプロセスIDが表示されます。誰でも助けることができますか?
USR=62
usrpid=`awk '$1 == "$USR" {print $2}' /home/hu/batchhu/dbscripts_tst2/user-pid.out2`
echo "first:" $USR $usrpid
# This shows 62 and blank for process id
usrpid=`awk '$1 == "62" {print $2}' /home/hu/batchhu/dbscripts_tst2/user-pid.out2`
echo "second:" $USR $usrpid
# This shows 62 and process id corresponding to this user in the file user-pid.out2
ベストアンサー1
@artmは、awkスクリプトを二重引用符で囲み、さまざまな文字をエスケープする技術を実演しました。ここに3つの技術があります。
シェルが変数を拡張できるように、単一引用符を区切ります。
usrpid=$(awk '$1 == "'"$USR"'" {print $2}' file)
シェル変数をawk変数に渡す
usrpid=$(awk -v usr="$USR" '$1 == usr {print $2}' file)
変数をエクスポートする場合は、awkのENVIRON配列を使用してください。
usrpid=$(awk '$1 == ENVIRON["USR"] {print $2}' file)
後者を好む必要があります。
@artmのアプローチなどの最初のアプローチでは、シェル変数の内容がコードに含まれていますawk
。コマンド注入の脆弱性変数の内容が厳密に制御されていない場合(たとえばを使用して)USR='blah" || system("reboot") || "'
呼び出されますreboot
。
2番目はコマンドインジェクションの脆弱性を引き起こしませんが、バックスラッシュ文字が含まれている場合、Cと同様のバックスラッシュエスケープシーケンスが拡張されるため、変数に$USR
シェル変数と同じ内容は含まれません。usr
awk
$USR
awk
使用時にENVIRON
そのような問題はありません。