Procura de um ficheiro no Unix para uma determinada cadeia de caracteres e, em seguida, outro conjunto de cadeias de caracteres dentro deste ficheiro e imprime também as propriedades do ficheiro

1

Estou usando o comando para procurar por arquivos que aparecem em um determinado diretório no Unix, arquivos que terminam *.sas e que contenham a string DB2 . Então eu quero procurar o conjunto de arquivos resultante para as Strings DSN= ou DATASRC= e também imprimir a linha contendo essas strings. Então, este é o comando FInd que estou usando:

find '/shrproj/'  -type f -name '*.sas'  -exec  grep   -il 'DB2'  {} \;  2> /dev/null  |  xargs   egrep   -Ri  'DSN=|DATASRC='

Isso me dá a saída desejada:

/shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas:                   ,"DSN=%UPCASE(&the_database.)"
/shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas:                   ,"DSN=%UPCASE(&the_database.)"

Mas agora eu também quero imprimir as propriedades do arquivo (usando a opção -ls) seguindo o resultado acima, ou seja, o abaixo é o que pretendo alcançar:

/shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas:                   ,"DSN=%UPCASE(&the_database.)"
/shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas:                   ,"DSN=%UPCASE(&the_database.)"
61522   19 -rwxrwsr-x  1 sas       sas          18546 Jun  2  2010 /shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas

As propriedades do arquivo na última linha acima são as mesmas ao usar o comando find com a opção -ls.

 find /shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas -ls

Então, como eu faço isso para cada arquivo usando o primeiro comando Find que estou usando acima?

Por favor me avise. Obrigado.

    
por pchegoor 14.11.2014 / 22:09

2 respostas

2

Apenas:

find '/shrproj/'  -type f -name '*.sas' \
    -exec  grep -iq 'DB2'  {} \; \
    -exec  grep -ie  DSN= -e DATASRC= {} \; \
    -ls
    
por 14.11.2014 / 22:34
0

Eu sugeriria algo ao longo das linhas deste (não posso fazer tudo em um one-liner); -)

OLDIFS="$IFS"
IFS=$'\n'
for i in $(find '/shrproj/' -type f -name '*.sas'); do
 G1="$(grep -il 'DB2' "$i")"
 if [ -n "$G1" ]; then
  G2="$(egrep -Ri 'DSN=|DATASRC=' "$i")"
  if [ -n "$G2" ]; then
   echo "$G1"
   echo "$G2"
   ls -l "$i"
  fi
 fi
done
IFS="$OLDIFS"
    
por 14.11.2014 / 22:18

Tags