Domanda

mi sono imbattuto in un bel one-liner per la ricerca di testo e stampare i risultati con un determinato numero di ultimi e seguendo le linee. Sto cercando di creare uno script da questo. Finora questo è quello che ho:

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

Il problema è che l'output del comando nawk non appare sullo schermo

>xgrep "bin/sh" * 0 3
>

Ma se digito il comando, ottengo un corretto output:

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

Qual è la ragione di questo e come posso convincere lo scritto per funzionare?

È stato utile?

Soluzione

Provare a utilizzare:

xgrep "bin/sh" '*' 0 3

, invece.

L'espansione del termine jolly sta accadendo nella shell corrente prima gli argomenti vengono passati allo script come mostrato in questa trascrizione:

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

Si può vedere come questi argomenti lavorano con il seguente script semplice e uscita:

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

Aggiornamento:

In base alla tua domanda nei commenti:

  

Grazie. Ha funzionato quando ho avvolto il file con apici. C'è un modo che io possa fare questo all'interno dello script in modo che l'utente non deve preoccuparsi di digitare virgolette singole?

No, è perché il guscio sta facendo prima lo script lo vede mai. Tuttavia, se si sposta la specifica del file fino alla fine della riga di comando in tal modo:

xgrep include 0 3 *.c

è possibile modificare lo script non solo di processo argomento numero 4, ma tutti argomento dopo che pure, uno alla volta. Poi, quando sono stati ampliati dalla shell, esso non importa.

Qualcosa di simile (con il gawk / nawk su una sola riga):

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

Lasciando il guscio di gestire la vostra espansione e l'utilizzo di un ciclo permette anche di fare i trucchi come ad esempio la stampa del nome di file con ogni blocco (o linea) di uscita:

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");
    ==========
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top