grep command in bash scripting

0
grepstr()
{
 grep "$1 $2" $TMP/"ORACLE_SID"_dbmode.txt > /dev/null 2>$1
}
  1. Qual é o significado do comando acima?
  2. Quais são $1 e $2 ? Por que é necessário?
  3. Existe alguma alternativa para usar $1 e $2 ?
por Galvin Verghese 22.03.2011 / 08:25

2 respostas

3

É exatamente assim que o código se parece?

Como é, é uma função que leva dois argumentos, digamos que são arg1 e arg2 .

Em seguida, ele lê um arquivo chamado ORACLE_SID_dbmode.txt e imprime todas as linhas que contêm arg1 arg2 (unidas por um espaço entre elas) e salva as mensagens de erro em um arquivo chamado arg1 .

Isso é muito confuso, então não acho que esse seja o código real.

Eu imagino que seja realmente isso:

grepstr()
{
    grep "$1" "$2" $TMP/"$ORACLE_SID"_dbmode.txt >/dev/null 2>&1
}

Mudanças:

  • "$1 $2" se torna "$1" "$2"
  • ORACLE_SID se torna $ORACLE_SID
  • 2>$1 se torna 2>&1

Se sim, poderia ser usado de duas maneiras:

grepstr options string_or_pattern

por exemplo:

grepstr -i something

permite imprimir (veja abaixo) todas as linhas no arquivo "$ORACLE_SID"_dbmode.txt que incluem a string something , Something , SOMETHING , etc.

-i significa maiúsculas e minúsculas e é apenas um exemplo; qualquer opção poderia ser usada.

(Além disso, tecnicamente something não é uma string, mas um padrão, por exemplo, [0-9] corresponderia a qualquer dígito).

A segunda maneira é:

grepstr string_or_pattern filename

Nesse caso, ele imprimirá todas as linhas correspondentes a string_or_pattern em filename ou "$ORACLE_SID"_dbmode.txt .

Isso parece menos provável, mas é possível, dependendo de como o código é usado.

Também poderia ser chamado assim:

grepstr option1 option2

mas que lida da entrada padrão (por exemplo, o teclado) e imprime todas as linhas que continham "$ORACLE_SID"_dbmode.txt , o que certamente não é o pretendido, dado que "$ORACLE_SID"_dbmode.txt parece um nome de arquivo, não uma string ou padrão para combinar.

Se meu palpite estiver correto, o código não é >/dev/null 2>$1 , em vez disso, é >/dev/null 2>&1 , o que significa que as mensagens de saída e de erro não são impressas.

>/dev/null significa que a saída padrão do grep (ou seja, as linhas correspondentes) está sendo enviada para /dev/null , que é um arquivo especial que o sistema operacional simplesmente ignora.

2>&1 após >/dev/null significa que as mensagens de erro também são enviadas.

Portanto, se a saída não for importante, grepstr provavelmente está sendo chamado assim:

if grepstr...

ou assim:

grepstr...
if [ $? -ne 0 ]

para executar apenas alguns códigos, se houver correspondência.

Em resposta à outra parte da sua pergunta, sim, poderia ser alterado para

grepstr()
{
    grep "$@" $TMP/"$ORACLE_SID"_dbmode.txt > /dev/null 2>&1
}

O "$@" expande para "$1" "$2" "$3"... (ou seja, quantos argumentos forem fornecidos).

Acho que seria melhor, porque seria mais flexível.

Por outro lado, se precisar de dois argumentos por algum motivo que não consigo pensar, então talvez "$1" "$2" seja o que o autor pretendia.

    
por 22.03.2011 / 08:55
0

$1 e $2 são parâmetros. Seu snippet está definindo a função grepstr .

Por exemplo, executando

grepstr first second

na verdade executa o comando

grep "first second" $TMP/"ORACLE_SID"_dbmode.txt

e redireciona a saída para /dev/null (que é o coletor de mensagens, tudo o que foi colocado desaparece).

Basicamente, quando você executa script (ou função), $1 , $2 , $3 (etc.) são parâmetros que você forneceu. Você pode testar se o parâmetro está definido com -z , por exemplo if [ -z $3 ]; then ... .

    
por 22.03.2011 / 08:31

Tags