AIX에서 -A/-B 대체 전/후의 Grep 라인

AIX에서 -A/-B 대체 전/후의 Grep 라인

-B나는 및 플래그를 지원하지 않는 AIX 6.1을 사용하고 있습니다 -A.

grep: Not a recognized flag: B

내가 달리고 싶다고 가정 해 봅시다.

cat file | grep -E -B4 'Directory entry type.*Indirect' | grep "Database name" | awk  '{print $4}'

AIX에서 이런 종류의 논리를 어떻게 수행할 수 있습니까?

편집하다

내 실제 코드는 다음과 같습니다.

NAME_EXISTS=`db2 LIST DB DIRECTORY | grep -E -B5 'Directory entry type.*Remote' | grep "Database alias" | awk '{print $4}' | grep -i ${NAME} | wc -l`
if [ ${NAME_EXISTS} -gt 0 ]; then
    db2 LIST DB DIRECTORY | grep -E -A5 "Database alias.*${NAME}"
fi

아이디어는 이라는 이름의 원격 DB가 있는지 찾는 것입니다 $NAME. 이를 찾으면 시작하는 5줄을 표시합니다 Database alias.*${NAME}. $NAME에서 고유합니다 Database alias.

그리고 db2 LIST DB DIRECTORY출력은 다음과 같습니다.

 System Database Directory

 Number of entries in the directory = 3

Database 1 entry:

 Database alias                       = OLTPA
 Database name                        = OLTPA
 Local database directory             = /db2/data
 Database release level               = 10.00
 Comment                              =
 Directory entry type                 = Indirect
 Catalog database partition number    = 0
 Alternate server hostname            =
 Alternate server port number         =

Database 2 entry:

 Database alias                       = OLTPF
 Database name                        = OLTP
 Node name                            = OLTPN
 Database release level               = 10.00
 Comment                              =
 Directory entry type                 = Remote
 Catalog database partition number    = -1
 Alternate server hostname            =
 Alternate server port number         =

Database 3 entry:

 Database alias                       = ADMIN
 Database name                        = ADMIN
 Local database directory             = /db2/data
 Database release level               = 10.00
 Comment                              =
 Directory entry type                 = Indirect
 Catalog database partition number    = 0
 Alternate server hostname            =
 Alternate server port number         =

출력 은 NAME=OLTPF다음과 같습니다:

 Database alias                       = OLTPF
 Database name                        = OLTP
 Node name                            = OLTPN
 Database release level               = 10.00
 Comment                              =
 Directory entry type                 = Remote

왜냐하면 NAME=OLTPE출력이 없을 것이기 때문이다.

답변1

ed는 이 작업을 완료하는 간단한 방법을 제공할 수 있습니다.

일치 항목이 하나만 있다고 가정할 수 있다면 파이프라인에 대한 대안으로 ed를 사용하고 불필요한 cat 및 보조 grep을 제거합니다.

ed -s file <<\EOED | awk '/Database name/ {print $4}'
    /Directory entry type.*Indirect/-4,//p
    q
EOED

여러 개가 있는 경우,겹치지 않는일치하는 경우 ed의 전역 명령을 사용하여 표시할 수 있습니다.

ed -s file <<\EOED | awk '/Database name/ {print $4}'
    g/Directory entry type.*Indirect/-4,.p
    q
EOED

일치 항목이 겹치는 경우를 설명하기 위해 string 을 일치시키고 foo7행과 9행에 일치 항목이 있으며 각 일치 항목의 앞선 3개 행을 컨텍스트로 가져오고 있다고 가정하면 출력은 다음과 같습니다.

line 4      <--- context
line 5      <--- context
line 6      <--- context
line 7 foo  <--- matched
line 6      <--- context      <--- repeated
line 7 foo  <--- context      <--- repeated
line 8      <--- context
line 9 foo  <--- matched
line 10
line 11

답변2

나는 약간 다르게 할 것입니다. 먼저 db2 LIST DB DIRECTORY명령을 실행하고 해당 출력을 텍스트 파일에 저장합니다. 이렇게 하면 여러 번 다시 실행할 필요가 없습니다. 그런 다음 각 대상 이름에 대해 관련 줄을 수집하는 awk 스크립트에 이름을 전달합니다.

## Run the db command
tempfile=$(mktemp)
db2 LIST DB DIRECTORY > "$tmpfile"
## I am assuming you will have a loop for the different target names
for name in OLTPF OLTPA; do
  awk -v name="$name" '{
       if(/Database alias/){n=$4; a[n]=$0; i=1}
       if (i<=6 && i>1){ a[n]=a[n]"\n"$0}
       i++;
      }END{if(name in a){print a[name]}}' $tempfile
done

답변3

$ awk -v RS= -F'\n' -v OFS='\n' '$1 ~ " OLTPF$"{for (i=1;i<=6;i++) print $i}' file
 Database alias                       = OLTPF
 Database name                        = OLTP
 Node name                            = OLTPN
 Database release level               = 10.00
 Comment                              =
 Directory entry type                 = Remote

관련 정보