Pergunta

me deparei com um bom one-liner para procurar texto e imprimir os resultados com um determinado número de fuga e seguir linhas. Eu estou tentando criar um fora roteiro deste. Até agora, este é o que eu tenho:

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

O problema é que a saída do comando nawk não aparecer na tela

>xgrep "bin/sh" * 0 3
>

Mas se eu digitar o comando, recebo uma saída apropriada:

>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 é a razão para isso e como posso obter o script para o trabalho?

Foi útil?

Solução

Tente usar:

xgrep "bin/sh" '*' 0 3

em seu lugar.

A expansão do termo curinga está acontecendo no shell atual antes que os argumentos são passados ??para o seu script, como mostrado neste transcrição:

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

Você pode ver como estes argumentos trabalhar com o seguinte script simples e de saída:

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

Update:

Com base na sua pergunta nos comentários:

Graças. Ele trabalhou quando eu envolvi o arquivo com aspas simples. Existe uma maneira que eu poderia fazer isso dentro do script para que o usuário não tem que se preocupar com a digitação aspas simples?

Não, isso é porque o shell é fazê-lo antes de seu script nunca vê-lo. No entanto, se você mover a especificação de arquivo para o final da linha de comando, assim:

xgrep include 0 3 *.c

você pode modificar seu script não apenas processo argumento número 4, mas todas argumento depois disso, bem como, um de cada vez. Então, quando eles foram expandidos pela shell, ele não importará.

Algo como (com a gawk / nawk em uma única linha):

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

Deixar o shell lidar com a sua expansão e usando um loop também permite fazer truques como a impressão do nome do arquivo com cada bloco (ou linha) de saída:

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");
    ==========
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top