変数と一致し、出力を提供する次のスクリプトを実行するのに役立ちます。スクリプトが動作しています。精密列1と2と一致するが、部分のマッチ。
cat ~/bin/MYSH
#!/bin/bash
arg="${1:?}"
awk -v arg="${arg//\\/\\\\}" '$1 == arg || $2 == arg' "$@" inputfile
入力ファイル -
1111 1111RETAIL RETAIL8888Node
2222 2222RETAIL RETAIL7777Node
3333 3333AUDITTEST AUDIT6666Node
4444 4444AUDIT AUDIT3333Node
5555 5555SALE SALE4444Node
6666 6666SALE SALE2222Node
7777 7777FINANCE FINANCE1111Node
8888 8888FINANCE FINANCE5555Node
スクリプトは、以下のように、列1または2に入力された単語と正確に一致する項目を検索して出力を提供します。
$ MYSH 6666
6666 6666SALE SALE2222Node
$ MYSH 4444AUDIT
4444 4444AUDIT AUDIT3333Node
また、以下のように、列2に2〜3文字または一致する文字がある場合に出力を提供するには、このスクリプトが必要です。
予想出力 -
$ MYSH 4444AU
4444 4444AUDIT AUDIT3333Node
または
MYSH 7777FINAN
7777 7777FINANCE FINANCE1111Node
答え1
テスト$1 == arg
は本物arg
最初のフィールドの値が変数と等しい場合。値がarg
どこかにあるかどうかをテストするには、$1
この関数を使用できますindex()
。この関数は、部分文字列が見つかった場所を返し、見つからない場合は0を返します。
#!/bin/sh
arg=${1:?} awk 'index($1,ENVIRON["arg"]) || index($2,ENVIRON["arg"])' inputfile
フィールドの先頭でのみ部分文字列を一致させるには、関数のindex()
戻り値が1であることを確認してください。
#!/bin/sh
arg=${1:?} awk 'index($1,ENVIRON["arg"])==1 || index($2,ENVIRON["arg"])==1' inputfile
また、スクリプトの最初の引数をawk
環境変数としてコマンドに渡して、バックスラッシュを二重スラッシュに変更せずに使用できるようにしました。
一つできる$1 ~ ENVIRON["arg"]
ユーザー指定の値を最初のフィールド値の正規表現として使用して正規表現一致を実行する使用(または$1 ~ "^" ENVIRON["arg"]
最初にのみ一致)も可能です。しかし、これはユーザーが自分が提供していることを知らない限り不適切です。正規表現文字列ではなく。