ホームページ >システムチュートリアル >Linux >awk の特殊モード BEGIN と END を使用して処理する方法
awk シリーズの 8 番目のセクションでは、変数、数値式、代入演算子などの強力な awk コマンド関数を紹介しました。
このセクションでは、awk 関数、つまり awk の特殊モード BEGIN と END について詳しく学習します。
複雑な awk 操作を構築するさらなる方法を開発し模索するにつれて、awk のこれらの特別な機能がいかに強力であるかを証明していきます。
始める前に、awk シリーズの概要を確認しましょう。このシリーズを開始したときに、awk 命令の一般的な構文が次のようなものであると指摘したことを思い出してください:
リーリー上記の構文では、awk スクリプトの形式は次のとおりです。
リーリー通常、スクリプト内のパターン (/pattern) は正規表現であることがわかります。さらに、ここで特別なパターン BENGIN および を使用することもできます。終わり# ##。したがって、次の形式で awk コマンドを記述することもできます: リーリー
awk スクリプトで特別なモードを使用する場合:BEGIN と END、対応する意味は次のとおりです:
理解を容易にするために、セクション 8 の例を使用して説明します。この例は、Tecmint が所有し、domains.txt というファイルに保存されているドメイン名のリストに関するものです。
リーリー リーリー
ファイルの内容を表示 この例では、ドメイン名
tecmint.com が Domains.txt ファイルに出現する回数を数えることを目的としています。そこで、タスクを完了するのに役立つ、変数、数式、代入演算子のアイデアを使用する簡単なシェル スクリプトを作成しました。スクリプトの内容は次のとおりです。 リーリー 次に、上記のスクリプトの awk コマンドに、以下のように 2 つの特別なパターンを適用しましょう:
BEGINと END : スクリプトを置く必要があります:
リーリーは次のように変更されました:
awk ' BEGIN { print "文件中出现 tecmint.com 的次数是:" ; } /^tecmint.com/ { counter+=1 ; } END { printf "%s/n", counter ; } ' $file
在修改了 awk 命令之后,现在完整的 shell 脚本就像下面这样:
#!/bin/bash for file in $@; do if [ -f $file ] ; then ### 输出文件名 echo "File is: $file" ### 输出文件中 tecmint.com 出现的总次数 awk ' BEGIN { print "文件中出现 tecmint.com 的次数是:" ; } /^tecmint.com/ { counter+=1 ; } END { printf "%s/n", counter ; } ' $file else ### 若输入不是文件,则输出错误信息 echo "$file 不是一个文件,请指定一个文件。" >&2 && exit 1 fi done ### 成功执行后使用退出代码 0 终止脚本 exit 0awk 模式 BEGIN 和 END
当我们运行上面的脚本时,它会首先输出 domains.txt 文件的位置,然后执行 awk 命令脚本,该命令脚本中的特殊模式 BEGIN 将会在从文件读取任何行之前帮助我们输出这样的消息“文件中出现 tecmint.com 的次数是: ”。
接下来,我们的模式/^tecmint.com/ 会在每个输入行中进行比较,对应的动作{ counter+=1 ; } 会在每个匹配成功的行上执行,它会统计出 tecmint.com 在文件中出现的次数。
最终,END 模式将会输出域名 tecmint.com 在文件中出现的总次数。
$ ./script.sh ~/domains.txt用于统计字符串出现次数的脚本
最后总结一下,我们在本节中演示了更多的 awk 功能,并学习了特殊模式 BEGIN 和 END 的概念。
正如我之前所言,这些 awk 功能将会帮助我们构建出更复杂的文本过滤操作。第十节将会给出更多的 awk 功能,我们将会学习 awk 内置变量的思想,所以,请继续保持关注。
以上がawk の特殊モード BEGIN と END を使用して処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。