次のスクリプトを作成し、名前を付けてfind
保存しましたが、bin
期待した結果は出ません。実行すると、find TEST
すべての行のすべての項目と一致し、TEST
出力が提供されます。しかし、私のスクリプトがTEST
最初の列にしか見えないようにしたいと思います。使ってるgrep
のに使えば出来そうだったけどawk
使ってはいけませんねawk
。
入力ファイル:
DEV RETAIL RETAILDEVNode
TEST RETAIL RETAILTESTNode
TEST AUDIT AUDITTESTNode
QA AUDIT AUDITQANode
PROD SALE SALEPRODNode
QA SALE SALETESTNode
QA FINANCE FINANCEQANode
PROD FINANCE FINANCEPRODNode
grep $1 inputfile`
出力:
TEST RETAIL RETAILTESTNode
TEST AUDIT AUDITTESTNode
QA SALE SALETESTNode
予想出力:
TEST RETAIL RETAILTESTNode
TEST AUDIT AUDITTESTNode
答え1
そしてアッ:
$ awk '$1=="TEST"' file
TEST RETAIL RETAILTESTNode
TEST AUDIT AUDITTESTNode
そしてgrep:
$ grep '^TEST ' file
TEST RETAIL RETAILTESTNode
TEST AUDIT AUDITTESTNode
そしてsed:
$ sed -n '/^TEST /p' file
TEST RETAIL RETAILTESTNode
TEST AUDIT AUDITTESTNode
そして真珠:
$ perl -ane 'print if $F[0] eq "TEST"' file
TEST RETAIL RETAILTESTNode
TEST AUDIT AUDITTESTNode
そしてルビー:
$ ruby -ane 'puts $_ if $F[0] == "TEST"' file
TEST RETAIL RETAILTESTNode
TEST AUDIT AUDITTESTNode
ユチョン強く打つ:
while IFS= read -r line; do
[[ $line == TEST* ]] && echo "$line"
done < file
TEST RETAIL RETAILTESTNode
TEST AUDIT AUDITTESTNode
最後にスクリプトを使用してください。find_by_first_field
find
スクリプト名として使用しないでください。
find
変数が~/bin
以前に存在していた場合は、システムを上書きします。/usr/bin
PATH
- スクリプトの機能をさらに説明する名前で名前を付けることをお勧めします。
cat ~/bin/find_by_first_field
#!/bin/bash
exec awk -v arg=${1:?} '$1==arg' "${@:2}"
使用法:
find_by_first_field <PATTERN> <file1> [file2 file3]
説明する:
-v arg
awk
内部的に変数を渡す方法はありますか?$1
最初の引数と混同しないawk
ように、最初のフィールド(スペースとタブで区切られた)がデフォルトです。bash
$1
arg
awk
宣言された変数です${1:?}
最初のパラメータです$1
。バッシュを使ってパラメータ拡張、最初のパラメータが見つからないとエラーが発生します。${@:2}
$@
パラメータのリストです。${@:2}
同じですが、$1
最初のパラメータがすでに使用されているため、秒要素で始まります。