这是脚本的代码,在其中我必须检查文件名为“ pretempsc.cfg”并按原样打印其内容。。仅对于其他文件,我应该将以“ abc disable ...”开头的行修改为“ no abc ...”。
#!/bin/sh
IN_FILE=$1
OUT_FILE=$2
WhatFileIsIt() {
awk -v filename=$IN_FILE '
BEGIN {
scnode = 0;
if (filename == "pretempsc.cfg") {
scnode = 1; }
}
{
if (!scnode) {
/^abc disable/ {
print "no abc "$4"";
next;
}
print;}
}
else {print}
}
'
}
cat $IN_FILE | WhatFileIsIt | cat > $OUT_FILE
执行此脚本时,出现以下错误:
awk: cmd. line:9: /^abc disable/ {
awk: cmd. line:9: ^ syntax error
awk: cmd. line:16: else {print}
awk: cmd. line:16: ^ syntax error
从我的查找来看,我怀疑在操作块中使用if和condition-action是错误的,但是我无法确切地找出错误所在。
注意:我必须在shell脚本中使用awk,并且还有很多类似于WhatFileIsIt的其他函数,它们在IN_FILE上进行自己的处理。
是的,您需要将该模式匹配更改为完整的if
语句:
if (/^abc disable/) {
print "no abc "$4"";
next;
}
(/pattern/
是的简写$0 ~ /pattern/
,其中$0
包含整个输入行。)
请注意,print
there仅在输入之后打印输入的第四列no abc
,因此abc disable foo bar doo
变成just no abc bar
。我不确定这是否是您想要的。
在我们讨论它的同时,还会想到其他一些事情...如果它们太明显或与您的其余脚本冲突,则可以忽略其中的任何一个。(希望我们没有犯太多错误。)
我认为的末尾还有一个右大括号,print
看来最深处条件的缩进有些偏离,因此需要重写一下:
{
if (!scnode) {
if (/^abc disable/) {
print "no abc " $4;
next;
}
print;
} else {
print;
}
}
但是从这里开始,似乎唯一要做的事情是当!scnode
true和/^abc disable/
match都成立时,在所有其他情况下,只有print
。因此,我们可以将条件与&&
(当然,不同类型文件之间的分隔不再明确):
{
if (!scnode && /^abc disable/) {
print "no abc "$4"";
next;
} else {
print;
}
}
由于存在next
缩短执行时间的条件,因此最终代码print
可以不包含该else
子句,并且实际上,由于整个代码块只是an if
,我们可以将条件降至主要级别,然后执行无条件的默认打印操作。
!scnode && /^abc disable/ {
print "no abc "$4"";
next;
}
1;
(当然,现在看起来可能有点过于简洁。)
另外,在shell脚本中,您无需打扰猫,最好让它们保持睡眠状态,而仅使用shell进行重定向。(并引用shell变量。)
WhatFileIsIt < "$IN_FILE" > "$OUT_FILE"
该函数的名称有点令人困惑,它实际上并没有回答任何“什么”问题,而是处理文件。也许像ProcessFile
?
而且,在谈论函数时,该函数使用的变量IN_FILE
不是它的局部变量。如果曾经需要为两个不同的文件运行一个函数,可能会造成混淆。像shell脚本本身一样,该函数还可以接受参数,调用MyFunction foo
,使之$1
包含foo
在函数内部。
所以我可能会做类似的事情
ProcessFile() {
awk < "$1" -v filename="$1" '
[...]
(将输入重定向放在awk命令行的中间还是结尾都没关系。)
用于:
ProcessFile "$IN_FILE" > "$OUT_FILE"
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句