我遇到了一个很好的单行搜索文本,并使用给定数量的尾随行和后续行打印出结果。我正在尝试创建一个脚本。 到目前为止,这就是我所拥有的:
# *********************************************************
# This uses nawk to list lines coming prior to and after
# the given search string.
# Format: xgrep <string> <file> <before> <after>
# ********************************************************
STR=$1
FILE=$2
BEF=$3
AFT=$4
export STR
export FILE
export BEF
export AFT
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=$BEF a=$AFT s=$STR $FILE
问题是nawk命令的输出没有出现在屏幕上
>xgrep "bin/sh" * 0 3
>
但如果我输入命令,我会得到一个正确的输出:
>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=0 a=3 s="bin/sh" *
#!/bin/sh
export AEGIS_PROJECT=$1
export EDITOR=cat
#!/bin/sh
aegis -cpu $pwd
aegis -dbu $1
#!/bin/sh
cd $HOME/ex_7/src/DTTCom
NRMan alphabuild clean
NRMan alphabuild library ex_7 8.19 app TEST DTTCom debug -j10
#!/bin/sh
cd $HOME/icx/src/DTTCom
NRMan alphabuild clean
NRMan alphabuild library icx_1 1.1 app TEST DTTCom debug -j10
#!/bin/sh
# *********************************************************
# This uses nawk to list lines coming prior to and after
# the given search string.
这是什么原因以及如何让脚本运行?
答案 0 :(得分:2)
尝试使用:
xgrep "bin/sh" '*' 0 3
代替。
在将参数传递给脚本之前,当前shell中会出现通配符扩展,如下所示:
pax: xgrep include *.c 0 3
#include <stdio.h>
gawk: (FILENAME=binmath.c FNR=1) fatal: division by zero attempted in '%'
pax: xgrep include '*.c' 0 3
#include <stdio.h>
// Prototypes - should go in separate header file.
void compBinNum (char*);
#include <stdio.h>
#include <string.h>
#include <string.h>
#define UTF8ERR_TOOSHORT -1
#define UTF8ERR_BADSTART -2
#include <stdio.h>
#include <errno.h>
#include <errno.h>
int main (void) {
FILE *file = fopen ("words.txt", "r");
您可以看到这些参数如何与以下简单脚本和输出一起使用:
pax: cat argtest
#!/bin/bash
echo Number of arguments: $#
echo Arguments: "$*"
pax: argtest *
Number of arguments: 32
Arguments: Makefile a.exe argtest binmath.c binmath.exe dev
file.db infile input.txt inputfile limit10 output.txt
p2.sh p2expected p2input1 p2input2 qq qq.c qq.cpp qq.exe
qq.exe.stackdump qq.pl qq.py qqin qqq.c qqq.s tmpfile
words2.txt xgrep xx.c xx.exe xx.pl
pax: argtest '*'
Number of arguments: 1
Arguments: *
<强>更新强>
根据您在评论中提出的问题:
感谢。当我用单引号包装文件时,它工作。有没有办法可以在脚本中执行此操作,以便用户无需打扰单引号?
不,那是因为shell在脚本看到它之前就已经这样做了。但是,如果将文件规范移动到命令行的末尾:
xgrep include 0 3 *.c
你可以修改你的脚本,不仅要处理参数4,还要处理之后的每个参数,一次一个。然后,当它们被外壳扩展时,无关紧要。
像(单行上的gawk / nawk):
STR=$1
BEF=$2
AFT=$3
while [[ ! -z "$4" ]] ; do
echo ========== "$4"
gawk '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=$BEF a=$AFT s=$STR "$4"
| sed "s/^/$4: /"
shift
done
echo ==========
让shell处理你的扩展并使用循环也允许你做一些技巧,比如用输出的每个块(或行)打印文件名:
pax: xgrep include 0 3 *.c
========== binmath.c
binmath.c: #include <stdio.h>
binmath.c:
binmath.c: // Prototypes - should go in separate header file.
binmath.c: void compBinNum (char*);
========== qq.c
qq.c: #include <stdio.h>
qq.c: #include <string.h>
qq.c: #include <string.h>
qq.c:
qq.c: #define UTF8ERR_TOOSHORT -1
qq.c: #define UTF8ERR_BADSTART -2
========== qqq.c
========== xx.c
xx.c: #include <stdio.h>
xx.c: #include <errno.h>
xx.c: #include <errno.h>
xx.c:
xx.c: int main (void) {
xx.c: FILE *file = fopen ("words.txt", "r");
==========