grep/awk が期待される結果を返しませんでした。

grep/awk が期待される結果を返しませんでした。

次のスクリプトを作成し、名前を付けて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 '^TEST ' file
TEST      RETAIL       RETAILTESTNode 
TEST       AUDIT       AUDITTESTNode

そして:

$ 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/binPATH
  • スクリプトの機能をさらに説明する名前で名前を付けることをお勧めします。

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 argawk内部的に変数を渡す方法はありますか?
  • $1最初の引数と混同しないawkように、最初のフィールド(スペースとタブで区切られた)がデフォルトです。bash $1
  • argawk宣言された変数です
  • ${1:?}最初のパラメータです$1。バッシュを使ってパラメータ拡張、最初のパラメータが見つからないとエラーが発生します。
  • ${@:2} $@パラメータのリストです。${@:2}同じですが、$1最初のパラメータがすでに使用されているため、秒要素で始まります。

おすすめ記事