「filename」というファイルで「yellow」という単語を含む行を探しているとしましょう。その後、出力に「シャツの色は黄色です」と表示したいと思います。
「filename」ファイルから抽出した行が次のようになるとします。
blue green orange black purple white yellow pink
私はこのように考えていましたが、それが正しくないことを知っています。
cat filename | grep yellow | awk '{print $7; echo "The colour of the shirt is {$7}}
答え1
デフォルトでは、grepを使用した後、1行の出力を取得しました。次に、行の7番目のフィールドを入力し、「シャツの色は「{フィールド7の出力}」と言いたいと思います。
まあ、それはもっと理解できます。
文字列で7番目のフィールドを印刷するには、次のようにします。
awk '{ printf "The color is %s\n", $7 }'
または
awk '{ print "The color is " $7 }'
(引用符で囲まれた文字列との間にはカンマやプラス記号、または何もありません。$7
文字列は互いに隣に書くだけでawkで連結されます。)
grep
スキップして内部的に同じことを行うこともできますawk
。
awk '/some regex/ { printf "the seventh field is %s\n", $7 }'
awk で許される正規表現はgrep -E
.(微妙な違いがあるかどうか覚えていないので、「ほとんど」) と同じです。ただし、パターンマッチングを特定のフィールドとして指定することもできます。
awk '$3 ~ /regex for field three/ { printf "the seventh field is %s\n", $7 }'
もちろん、一致するすべての行を処理します。愚かな例:
$ awk '$1 ~ /^j/ { printf "the shirt of %s is %s\n", $1, $2 } ' < shirts
the shirt of jimmy is blue
the shirt of joe is red
答え2
awk ‘/yellow/ { print “The colour of the shirt is yellow” }’ < filename
答え3
君は全部できるawk
ジェフが示すように、またはシェルで簡単に実行できます。
if grep -qF 'yellow' "filename"; then
echo 'The colour of the shirt is yellow'
fi
ここでは何も出力-q
せずgrep
(終了状態にのみ関心があるgrep
)、「固定文字列」(正規表現ではない)を使って検索していることを-F
知らせます。grep
コンテンツがある場合
[some unrelated data here]
shirt colour: yellow
[some unrelated shirt data here]
その後利用できます
awk '/^shirt colour:/ { print "The colour of the shirt is", $NF }' filename
$NF
...与えられた正規表現に一致する行の最後のフィールド()にある単語を使用してメッセージを出力します。
または、
awk '/^shirt colour:/ { printf("The colour of the shirt is %s\n", $NF) }' filename
$3
最後の2つの例では、(「最後のフィールド」)の代わりに(「スペースで区切られた3番目のフィールド」)を使用することもできます$NF
。