2009-04-23 63 views
2

我遇到了一個很好的單行搜索文本並使用給定數量的尾隨和後續行打印出結果。我正在嘗試創建一個腳本。 到目前爲止,這是我:帶有nawk的腳本不會將輸出打印到屏幕

# ********************************************************* 
# 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. 

這是什麼原因導致腳本工作?

回答

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,但說法爲好,一次一個。然後,當它們被shell擴展後,它就不會有問題了。

喜歡的東西(與單行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 ========== 

讓殼處理您的擴展和使用循環也可以讓你做花樣,如每塊打印文件名(或線)輸出:

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"); 
    ========== 
+0

謝謝。當我用「'包裝」文件「時它工作。有沒有一種方法可以在腳本中做到這一點,以便用戶不必打擾單引號? – Gayan 2009-04-23 07:18:50