/ 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
ができます。grep
cut
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
重要でない正規表現のように見える場合(例:.
、*
または[
... ]
)、不要な結果が発生する可能性があります。