我找到了一个命令,它从二进制文件中获取输入数据并写入输出文件。
nawk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=1 a=19 s="<Comment>Ericsson_OCS_V1_0.0.0.7" /var/opt/fds/config/ServiceConfig/ServiceConfig.cfg > /opt/temp/"$circle"_"$sdpid"_RG.cfg
它正在工作,但我无法弄清楚......有没有人可以帮我解释一下上面的命令是如何工作的以及它在做什么?...这个nawk太难理解了...... 。:( 提前谢谢......
答案 0 :(得分:0)
nawk并不难理解,与其他语言一样,我猜你无法理解它,因为它格式不正确,如果你格式化它就会知道它是如何工作的。
要回答您的问题,此命令将在给定的输入文件中搜索包含输入文本的行,并在匹配的行之前打印几行,在匹配的行之后打印几行。要打印的行数由变量“b”(之前没有行)和“a”(之后没有行)和要搜索的字符串/文本控制使用变量“s”传递。
此命令将有助于调试/故障排除,希望通过搜索某些错误文本并在其上方打印一些行来打印大型日志文件中的行(难以在vi或UNIX / LINUX上的其他编辑器中打开)在它之后。
所以在你的命令中
b=1 ## means print only 1 line before the matching line
a=19 ## means print 19 lines after the matching line
s="<Comment>Ericsson_OCS_V1_0.0.0.7" ## means search for this string
/var/opt/fds/config/ServiceConfig/ServiceConfig.cfg ## search in this file
/opt/temp/"$circle"_"$sdpid"_RG.cfg ## store the output in this file
你的格式化命令在下面,第一个看起来像c - > 0的条件,格式很容易解释,这意味着c--大于0. AWK中的NR变量给出了当前处理行的行号在正在处理的输入文件中。
nawk '
c-- > 0;
$0 ~ s
{
if(b)
for(c=b+1;c>1;c--)
print r[(NR-c+1)%b];
print;
c=a
}
b
{
r[NR%b]=$0
}' b=1 a=19 s="<Comment>Ericsson_OCS_V1_0.0.0.7" /var/opt/fds/config/ServiceConfig/ServiceConfig.cfg > /opt/temp/"$circle"_"$sdpid"_RG.cfg