grep은 한 줄에서 텍스트를 찾습니다. 하지만 처음에만 주석이 있는 경우 grep [duplicate]에서 제외하세요.

grep은 한 줄에서 텍스트를 찾습니다. 하지만 처음에만 주석이 있는 경우 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

여기서 문제는 두 번째 줄에도 마지막에 주석이 있기 때문에 역시 무시된다는 점입니다.

도와주세요.

감사합니다, R.A.

답변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*(콜론으로 구분된 값)이고 검색 문자열은 첫 번째 필드가 되며 원하는 출력은 두 번째 필드입니다) 이러한 제약 조건/조건 중 실제로는 없습니다.지적질문에. 그리고 질문에서 다음 줄을 제외하는 명령을 요구하는 동안시작의견을 보면 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중요하지 않은 정규식처럼 보이는 경우(예:., *또는 [... ]), 원치 않는 결과가 발생할 수 있습니다.

관련 정보