-B
나는 in 및 플래그를 지원하지 않는 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
아이디어는 이라는 이름의 원격 데이터베이스가 존재하는지 찾고 $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
1개 이상인 경우,중복 없음일치하는 경우 ed의 전역 명령을 사용하여 표시할 수 있습니다.
ed -s file <<\EOED | awk '/Database name/ {print $4}'
g/Directory entry type.*Indirect/-4,.p
q
EOED
중복 일치 사례를 설명하기 위해 문자열을 일치시키고 foo
7행과 9행에 일치 항목이 있고 각 일치 항목의 처음 세 줄을 컨텍스트로 사용한다고 가정하면 출력은 다음과 같습니다.
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