2017-11-01 7 views
2

필자는 AWK를 사용하여 여러 개의 디렉토리에서 특정 파일을 검색하고 필요한 정보를 출력하는 두 가지 기능을 각각 가지고 있습니다. 두 함수 모두 FILENAME과 필자가 필요로하는 특정 필드를 인쇄하고 스스로 잘 작동합니다. 보다 견고한 출력을 위해 함께 결합하고 싶습니다.한 줄에 여러 awk 출력을 결합하여 출력합니다.

저는 프로그래머가 아닙니다. 내가 갔을 때 나는 awk에 대해 읽는 동안 이것들을 썼다.

기능 1

cver() { 
X="" 
case $1 in 
("-b") X="bb";; 
("-c") X="cpe";; 
("-e") X="etech";; 
("-k") X="core";; 
("-o") X="ohgov";; 
("-h"|help) echo "'cver' allows us to see the software version 
running on all Company Juniper devices.\n'cver' is especially helpful 
in determining which devices require a software upgrade.\n\nOptions 
are -b for bb, -c for cpe, -e for etech, -k for core, and -o for 
ohgov.\n\nUse grep to find specific information. Ex: cver -c | grep 
name";; 
(*) echo "Unrecognized or incomplete command.\nUse -h for help.";; 
    esac 
[ $X ] && awk -vSRCH="$3" '/JUNOS/ && /boot/ && $5 ~ "^[[]" SRCH 
{sub ("/show.version", "", FILENAME); sub (".*/", "", FILENAME); 
print $5 " " FILENAME}' ~/svn/nw_config_data/*${X}.domain.net/show.version | sort 
} 

입력/출력 예 :

% cver -k <---input 
[11.4R10.3] device.core.domain.net <---ouput 

기능 2

cmod() { 
X="" 
case $1 in 
("-b") X="bb";; 
("-c") X="cpe";; 
("-e") X="etech";; 
("-k") X="core";; 
("-o") X="ohgov";; 
esac 
awk '/Model/ {sub ("/show.version", "", FILENAME); 
sub (".*/", "", FILENAME); print FILENAME " " $2}' 
~/svn/nw_config_data/*${X}.domain.net/show.version | sort 
} 

입력/출력 예 :

% cmod -k <---input 
device.core.domain.net mx480 <---output 
,

이 스크립트가 수행하는 작업은 ~/svn/nw_config_data/디렉토리에 있으며 우리가 배포 한 모든 장치에 대한 디렉토리가 저장되어 있습니다. 각 장치 디렉토리에는 config 용 파일과 일부 show 명령이 있습니다. 내가 걱정하는 파일은 show.version 파일과 몇 줄의 정보입니다. "cver"의 경우 JUNOS Base OS 부팅 정보를 원합니다. "cmod"에 대해서는 Model에 대한 정보를 원합니다. 그러면 "X"가 -b = "bb"(device.bb.domain.net)과 같은 다른 장치 옵션을 가져옵니다.

다음은 show.version 파일의 예입니다.

Hostname: device-r0 
Model: ex3300-24t 
JUNOS Base OS boot [12.3R7.7] 
JUNOS Base OS Software Suite [12.3R7.7] 
JUNOS Kernel Software Suite [12.3R7.7] 
JUNOS Crypto Software Suite [12.3R7.7] 
JUNOS Online Documentation [12.3R7.7] 
JUNOS Enterprise Software Suite [12.3R7.7] 
JUNOS Packet Forwarding Engine Enterprise Software Suite [12.3R7.7] 
JUNOS Routing Software Suite [12.3R7.7] 
JUNOS Web Management [12.3R7.7] 
JUNOS FIPS mode utilities [12.3R7.7] 

이와 비슷한 지난 몇 일간의 검색을 시도해 보았습니다. awk 파이프에 대한 답변 하나를 보았지만 두 번째 awk 정보 만 출력합니다.

나는 파이핑 대신 awk를 & & 시도했다. 그리고 나에게 더 가까이 다가 갔지만 첫 번째 awk를 출력하고 두 번째 awk를 별도의 줄에 출력했다.

& & 예 :

cver() { 
X="" 
case $1 in 
("-b") X="bb";; 
("-c") X="cpe";; 
("-e") X="etech";; 
("-k") X="core";; 
("-o") X="ohgov";; 
("-h"|help) echo "'cver' allows us to see the software version 
running on all Company Juniper devices.\n'cver' is especially helpful 
in determining which devices require a software upgrade.\n\nOptions 
are -b for bb, -c for cpe, -e for etech, -k for core, and -o for 
ohgov.\n\nUse grep to find specific information. Ex: cver -c | grep 
name";; 
(*) echo "Unrecognized or incomplete command.\nUse -h for help.";; 
    esac 
[ $X ] && awk -vSRCH="$3" '/JUNOS/ && /boot/ && $5 ~ "^[[]" SRCH 
{sub ("/show.version", "", FILENAME); sub (".*/", "", FILENAME); 
print $5 " " FILENAME}' ~/svn/nw_config_data/*${X}.domain.net/show.version 
| sort && awk '/Model/ {sub ("/show.version", "", FILENAME); 
sub (".*/", "", FILENAME); print $2}' 
~/svn/nw_config_data/*${X}.domain.net/show.version | sort 

입력/출력 예 : I는 입력/출력이 원하는

% cver -k <---input 
[11.4R10.3] device.core.domain.net <---output 
mx480 <---output 

: 나는의 인쇄 부분을 상상

% cver -k <---input 
device.core.domain.net mx480 [11.4R10.3] <---output 

모양은 다음과 같습니다.

print FILENAME " " $2 " " $5 

나는 또한 나의 첫 번째 함수에 추가/모델/& & $ 2 시도했다, 그러나 그것은 나에게 출력을 제공하지 않습니다 난 그냥이 시점에서 잃었어요.

예 :

cver() { 
X="" 
case $1 in 
("-b") X="bb";; 
("-c") X="cpe";; 
("-e") X="etech";; 
("-k") X="core";; 
("-o") X="ohgov";; 
("-h"|help) echo "'cver' allows us to see the software version 
running on all Company Juniper devices.\n'cver' is especially helpful 
in determining which devices require a software upgrade.\n\nOptions 
are -b for bb, -c for cpe, -e for etech, -k for core, and -o for 
ohgov.\n\nUse grep to find specific information. Ex: cver -c | grep 
name";; 
(*) echo "Unrecognized or incomplete command.\nUse -h for help.";; 
    esac 
[ $X ] && awk -vSRCH="$3" '/JUNOS/ && /boot/ && $5 && /Model/ && $2 ~ "^[[]" SRCH 
{sub ("/show.version", "", FILENAME); sub (".*/", "", FILENAME); 
print FILENAME " " $2 " " $5}' ~/svn/nw_config_data/*${X}.domain.net/show.version | sort 
+0

입력 데이터의 적절한 샘플을 보여 주면 답변을 얻을 가능성이 높습니다. 그런 다음 추출하려는 부분을 개별적으로 확인한 것 같습니다. –

+0

질문을 편집하여 자세한 정보를 보여 드리겠습니다. 고맙습니다. – rewalker3

+0

수정 사항이 적용됩니다. 잘하면 도움이됩니다. – rewalker3

답변

0

난 그냥이 언급하는 일이 스크립트를 작성하여 동료에게 프로그래밍 경험이 있음을 알았습니다. 그는 miken32가 제공 한 것에 찌르는 것을 결정하고 내가 찾고있는 것을 정확히하는 작업 스크립트를 만들었습니다.

주니퍼는 소프트웨어 버전 전반에 걸쳐 show.version 정보를 표준화하지 않았으며, 앞으로도 더 많은 정보를 얻기 위해이 스크립트를 곧 확장 할 계획입니다. 이 스크립트는 주니퍼 기반이기 때문에 현장에 배포 한 시스코 장비는 거의 없습니다.

"-a"옵션을 추가하여 모든 호스트를 가져 왔습니다. dirs 섹션은 선택된 옵션 (-b, -c, -e 등)에 대한 모든 호스트를 볼 수있게하고 중복 정보가 채워지는 것을 방지하기 위해 for 루프에서 나타냅니다. 나중에 옛 cver에서 도움과 (*) 옵션을 다시 추가 할 것입니다.

원본 cver 스크립트의 목적은 주니퍼 소프트웨어를 업그레이드하기 위해 유지 관리 기간을 계획 할 수 있도록 모든 장치의 소프트웨어 버전을 가져 오는 것이 었습니다. 그런 다음 모델을 보는 것도 좋겠다고 결정 했으므로 모델을 가져 오기 위해 cmod 스크립트를 작성했습니다. 일부 모델에는 소프트웨어를로드하기 전에 선점 재부팅이 필요한 소프트웨어 업그레이드 프로세스 (mx80)의 버그가 있기 때문에이 정보가 필요했습니다.

이 스크립트는 ISP 또는 심지어 많은 라우터와 스위치가 설치된 엔터프라이즈 환경에서 근무하는 모든 사람들에게 유용합니다. 이제 각 장치에 로그인하지 않고 이러한 정보를 얻기 위해 수동으로 명령을 실행하지 않고도 이러한 장치에 대한 정보를 신속하게 가져올 수 있습니다.

이제 새롭고 향상된 cver!

#!/usr/local/bin/zsh 
svn="$HOME/svn/nw_config_data/" 
case "$1" in 
    ("-a") 
    hosts="" 
    ;; 
    ("-b") 
    hosts=".bb.domain.net" 
    ;; 
    ("-c") 
    hosts=".cpe.domain.net" 
    ;; 
    ("-e") 
    hosts=".etech.domain.net" 
    ;; 
    ("-k") 
    hosts=".core.domain.net" 
    ;; 
    ("-o") 
    hosts=".ohgov.domain.net" 
    ;; 
esac 

dirs=($(ls -d $svn*$hosts*)) 
for hostdir in $dirs 
do 
host=$(echo $hostdir | grep -Eo "(\w|\.|-)*$") 

awk -v h=$host '/^JUNOS Base OS boot/{v=$5} /^Junos:/{v="["$2"]"} /^Model/{m=$2} END{if(m!="number"){printf("%s %s %s\n",h,m,v)}}' "$hostdir/show.version" 
done 
1

귀하의 awk 코드는 매우 복잡하다; 나는 당신을 (그리고 다른 사람들이) 더 쉽게 이해할 수있는 것으로 여기까지 상당히 단축했습니다!

/PATTERN/{STATEMENT} 라인은 PATTERN이 일치 할 때 EXPRESSION을 평가합니다. 따라서 해당 기준을 사용하여 변수에 할당하는 것은 매우 간단합니다. 그리고 우리는 우리가 수집 한 정보 인쇄 END 블록 (오히려 파일 이름으로 장난보다가, 단지 직접 변수를 설정 -v 플래그를 사용하여 원하는 정보를 전달합니다.)

#!/bin/zsh 

cver() { 
    svn="$HOME/svn/nw_config_data" 
    case "$1" in 
     ("-b") 
      host="bb.domain.net" 
      ;; 
     ("-c") 
      host="cpe.domain.net" 
      ;; 
     ("-e") 
      host="etech.domain.net" 
      ;; 
     ("-k") 
      host="core.domain.net" 
      ;; 
     ("-o") 
      host="ohgov.domain.net" 
      ;; 
     ("-h"|help) 
      echo "'cver' allows us to see the software version running on all Company Juniper devices.\n'cver' is especially helpful in determining which devices require a software upgrade.\n\nOptions are -b for bb, -c for cpe, -e for etech, -k for core, and -o for ohgov.\n\nUse grep to find specific information. Ex: cver -c | grep name\n" 
      exit 0 
      ;; 
     (*) 
      echo "Unrecognized or incomplete command.\nUse -h for help.\n" 
      exit 2 
      ;; 
    esac 
    awk -v "h=$host" '/^JUNOS Base OS boot/{v=$5} /^Model/{m=$2} END{printf("%s %s %s\n",h,m,v)}' "$svn/$host/show.version" 
} 
+0

이 답변은 가까운 나의 요구를 완전히 만족시키지 않았다. 1) 와일드 카드로 호스트 검색을 할 수 없으므로 "$ svn /"* "$ host/show.version"에 "*"를 추가하여 수정했습니다. 그러면 호스트 이름이 표시되지 않으므로/^ Hostname/search를 추가했습니다. 마지막으로이 스크립트는 내가 검색 한 호스트의 마지막 행만 인쇄합니다. END를 제거하면 어떤 호스트에 관계없이 모든 내용이 인쇄되고 show.version 파일에 줄이있는만큼 원하는 정보가 인쇄됩니다. 이것은 대답을 고무 시켰지만 감사합니다! – rewalker3