分类: LINUX
2015-11-20 11:52:33
Awk 的交互 SHELL脚本实现 “-”的使用情景
“ - ”的使用 #“ - ”表示awk的输入由标准输入不由文本输入
本文旨在区分清楚:
“-”的含义及使用情景
“-”键入内容导致脚本中$N应用时$N代表含义
(一)可写可不写“-”在脚本最后
(1)求阶乘脚本 #“-”为可选
awk '
BEGIN {
printf("Enter number: ")
}
$0 ~ /^[0-9]+$/ { #$0为键入内容,因为awk脚本的处理的输入为键入,改为$1效果相同
number=$0
fact=number
for ( x = number - 1 ; x > 1 ; x-- )
fact *= x
printf ("this factorial of %d is %g\n", number, fact )
exit
}
{
printf (" \ninvalid entry. entry a number: ")
}' - #此处“-”可写可不写,因为awk ‘{…}’后没有指定文件,默认标准输入从键入达到交互目的。
(2)格式转换脚本(阿拉伯数字转换为罗马数字)#“-”为可选
awk '
BEGIN {
split ("I,II,III,IV,V,VI,VII,VIII,IX,X",number,",")
printf ("please enter number: ")
}
$1 > 0 && $1 <= 10 { #$1为键入内容,因为awk脚本的处理的输入为键入,改为$0效果相同;若改为$2,则输入时第二个字段为1-10中数字即可执行
#split ("I,II,III,IV,V,VI,VII,VIII,IX,X",number,",")
print number[$1]
exit
}
{ print "invaild number" ; exit }
' - #此处“-”可写可不写,因为awk ‘{…}’后没有指定文件,默认标准输入从键入达到交互目的
###脚本中改为$2:
$2 > 0 && $2 <= 10 {
#split ("I,II,III,IV,V,VI,VII,VIII,IX,X",number,",")
print number[$2]
exit
}
执行效果:
注意此时脚本仅读取输入的内容中第二字段$2,即5
(二)必须写“-”于脚本最后
(1)检索特定文件中的字符脚本 #“-”必选
awk -v dir=$1 ' #$1为SHELL脚本的第一个参数
BEGIN { FS = "\t" ; OFS = "\t"
printf ( "Enter a file term: " )
FILENAME == dir {
entry[$1] = $2 #$1,$2为检索文件中的第一个字段和第二个字段
next #next将搜索的文件dir所有行全部读取,执行了数组赋值操作,所以下面的$1为键入的内容,例子“GIGO”
}
$1 ~ /^(quit|[qQ]|exit|[Xx])$/ { exit } #$1为“-”键入的检索内容,可改为$0
$1 != "" {
if ( $1 in entry )
print entry[$1]
else
print $1 " not found"
}
{
printf("Enter another file term (q to quit): ")
}' $1 – #$1为SHELL脚本的第一个参数
此脚本中最后的“-”必须输入,因为存在$1,awk会处理$1,而目的为从$1中检索我们输入的字符串“-”。
(2)执行效果:
检索的文件: