grep para um texto em uma linha. Mas se tiver um comentário apenas no início, exclua-o do grep [duplicate]

0

Estou tentando encontrar uma instância "test" em / etc / oratab. Mas queria exibir apenas a linha que não começa com um comentário. Abaixo estão as linhas do arquivo / etc / oratab:

#test:/u01/appl/oracle/test/db/tech_st/12.1.0.2:N
test:/b001/app/oracle/testrac/db/tech_st/12.1.0.2:N         # line added by Agent

É assim que estou tentando obter os detalhes que me interessam (colocado abaixo em um shell script:

DB_NAME=test
env_var='cat /etc/oratab |grep $DB_NAME |grep -v '#' |cut -d":" -f 2'
echo $env_var

O problema aqui é que, como a segunda linha também tem um comentário no final, ela também está sendo ignorada.

Por favor ajude.

Atenciosamente, RA

    
por user206245 24.04.2018 / 11:52

4 respostas

1

Uma solução muito mais simples do que reescrevê-lo para usar o awk seria adicionar um simples ^ para indicar o início de uma linha:

env_var='cat /etc/oratab |grep $DB_NAME |grep -v '^#' |cut -d":" -f 2'

O grep -v '^#' remove todas as linhas que começam com # e geralmente é útil.

    
por 24.04.2018 / 12:04
2

awk seria uma escolha melhor aqui:

DB_NAME=test; export DB_NAME
file=$(awk -F: '$1 == ENVIRON["DB_NAME"] {print $2; exit}' < /etc/oratab)

printf '%s\n' "$file"

No Solaris, certifique-se de fazer:

PATH=$(getconf PATH):$PATH

(e use #! /usr/xpg4/bin/sh - se estiver no Solaris 10 e anterior) para ter utilitários padrão. Ou use command -p awk . Caso contrário, você pode obter um awk antiquado dos anos 70.

    
por 24.04.2018 / 11:58
0

Com sed , você pode combinar grep s e cut em uma passagem:

sed "/^$DB_NAME:/! d;s///;s/:.*//" /etc/oratab

com

  • /^$DB_NAME:/ seleciona todas as linhas que começam com $DB_NAME seguido por : ; o ! inverte a correspondência, então o seguinte d excluiu todas as linhas que não correspondem a esse padrão
  • s/// remove a última correspondência, neste caso, o test:
  • s/:.*// remove o : e tudo o que se segue
por 24.04.2018 / 13:43
0

As outras respostas funcionam para o exemplo (o arquivo é CSV * (valores separados por dois pontos), A string pesquisada será o primeiro campo, saída desejada é o segundo campo), mas nenhuma dessas restrições / condições é realmente declarado na questão. E, enquanto a pergunta pede um comando que exclui as linhas que começam com um comentário, provavelmente não é isso que o OP realmente quer. (Que tal uma linha como unwanted line:blah:blah #test , que contém test em um comentário ?) A resposta que o OP quer é

grep '^[^#]*test' /etc/oratab

ou

grep "^[^#]*$DBNAME" /etc/oratab

que procura uma linha onde test aparece, e todos os caracteres antes dele são algo diferente de # .

Como de costume, você deve sempre citar suas referências de variáveis de shell (por exemplo, "$DB_NAME" e "$env_var" ) a menos que você tenha um bom motivo para não e você tem certeza de que sabe o que está fazendo. E, como Stéphane Chazelas aponta , if $DBNAME parece uma expressão regular não trivial (por exemplo, ele contém . , * ou [] ), provavelmente haverá resultados indesejados.

    
por 25.04.2018 / 03:15

Tags