Question

Je suis tombé sur une belle uniligne pour rechercher du texte et d'imprimer les résultats avec un certain nombre de lignes de fuite et suivant. Je suis en train de créer un script de ce. Jusqu'à présent, c'est ce que j'ai:

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

Le problème est que la sortie de la commande nawk ne figure pas sur l'écran

>xgrep "bin/sh" * 0 3
>

Mais si je tape dans la commande, je reçois une sortie correcte:

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

Quelle est la raison et comment puis-je obtenir le script fonctionne?

Était-ce utile?

La solution

Essayez d'utiliser:

xgrep "bin/sh" '*' 0 3

au lieu.

L'extension du terme générique se passe dans le shell courant avant que les arguments sont passés à votre script comme indiqué dans cette transcription:

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");

Vous pouvez voir comment ces arguments fonctionnent avec le script simple et sortie suivante:

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: *

Mise à jour:

Sur la base de votre question dans les commentaires:

  

Merci. Il a travaillé quand j'enveloppé le fichier avec des guillemets simples. Est-il possible que je puisse le faire dans le script afin que l'utilisateur n'a pas à se soucier de taper des guillemets simples?

Non, c'est parce que la coquille est en train de faire avant votre script voit jamais. Cependant, si vous déplacez la spécification de fichier à la fin de la ligne de commande ainsi:

xgrep include 0 3 *.c

vous pouvez modifier votre script pour non seulement argument numéro 4 processus, mais tous arguments après et, un à la fois. Puis, quand ils ont été développés par le shell, il ne sera pas question.

Quelque chose comme (avec le gawk / nawk sur une seule ligne):

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 ==========

Laisser la coquille gérer votre expansion et en utilisant une boucle vous permet également de faire des tours tels que l'impression du nom de fichier à chaque bloc (ou ligne) de sortie:

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");
    ==========
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top