grepは1行でテキストを検索します。ただし、最初にコメントがある場合はgrep [duplicate]から除外してください。

grepは1行でテキストを検索します。ただし、最初にコメントがある場合はgrep [duplicate]から除外してください。

/ etc / oratabで "test"インスタンスをgrepしようとしています。しかし、コメントで始まらない行だけを表示したいです。以下は、/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

これが私が興味のある詳細を取得しようとしている方法です(シェルスクリプトに次のように入力します)。

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

ここでの問題は、2行目にも最後にコメントがあるため、やはり無視されることです。

助けてください。

ありがとう、RA

答え1

awkより良い選択は次のとおりです。

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

printf '%s\n' "$file"

Solaris では、次のことを行う必要があります。

PATH=$(getconf PATH):$PATH

#! /usr/xpg4/bin/sh -Solaris 10以下の場合を使用)標準ユーティリティ用です。またはを使用してください。それ以外の場合は、1970年代の古い製品になる可能性がcommand -p awkあります。awk

答え2

awkを使って書き換えるよりも簡単な解決策は、行の始まりを表す単純な^を追加することです。

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

#で始まるすべての行を削除し、grep -v '^#'しばしば便利です。

答え3

を使用すると、sとtheを一度に組み合わせることsedができます。grepcut

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

そして

  • /^$DB_NAME:/一致を反転するために;で$DB_NAME始まるすべての行を選択するので、次はこのパターンと一致しないすべての行を削除します。:!d
  • s///この場合、最後の一致を削除します。test:
  • s/:.*//:そして次のすべてを削除

答え4

他の答えは例ではうまくいきますが(ファイルはCSV *(コロンで区切られた値)であり、検索文字列は最初のフィールドになり、必要な出力は2番目のフィールドです)、これらの制約/条件の実際にはありません。指摘質問に。そして、質問から次の行を除外するコマンドを要求している間スタートコメントを見ると、OPが本当に欲しいものではないかもしれません。 (次をunwanted line:blah:blah #test含む次のような行はどうですか?test コメントから? )OPが望む答えは次のとおりです。

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

または

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

その文字が表示される行を検索し、testその前のすべての文字は検索しません#

いつものように、そうしない妥当な理由がなく、自分が何をしているのかを明確に知らない限り、常にシェル変数参照(例:"$DB_NAME"and)を引用する必要があります。"$env_var"そして、Stéphane Chazelasが指摘したように$DBNAME重要でない正規表現のように見える場合(例:.*または[... ])、不要な結果が発生する可能性があります。

関連情報