2017-11-07 20 views
1

私はこれをさまざまなインターネット検索で把握しようとしており、stackoverflowを通して掘り下げています。私は、これを説明できるように努力します。awkが存在しない場合はファイルをスキップします

私は、設定リポジトリディレクトリを検索するスクリプトを用意しています。このスクリプトは、ジュニパーとシスコのルータとスイッチのディレクトリごとに配置されています。それぞれのデバイスディレクトリには、私が関心を持っているファイル "show.version"と "show.chassis.hardware"があります。 2番目のファイル "show.chassis.hardware"は、シスコのボックスにあるコマンドではないため、シスコのデバイスディレクトリにファイルは存在しません。また、デバイスがJuniperかCiscoかを簡単に教えてくれる名前付けスキームはありません。これも私のスクリプトが存在する理由の一部です。

さまざまなモデルやソフトウェアバージョンでもshow.versionファイルが異なる形式(CiscoとJuniperの両方)で出力されるため、私のawkは私たちが遭遇するすべてのフィールドがいっぱいです。

スクリプト:それは私がスクリプトを実行したときにどのように見える

#!/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" 
;; 
("-m") 
hosts=".maint.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 '/^Model/{m=$2} /^Model number/{m=$4} /^\*0/{m=$2} 
/^JUNOS Base OS boot/{v=$5} /^Junos:/{v="["$2"]"} /^BOOTLDR:/{v=$7} 
/^JUNOS EX Software Suite/{v=$5} /^ROM:/{v=$5} /^JUNOS Software 
Release/{v=$4} /^Chassis/{s=$2} /^Motherboard serial number/{s=$3} 
END {if(m!="number") {printf("%s %s %s %s\n",h,m,v,s)}}' 
"$hostdir/show.version" "$hostdir/show.chassis.hardware" 
done 

は:

私はそれが

% cver -b 
device1-e0.bb.domain.net ex4300-24t [14.1X53-D25.2] Serial# 
device2-e0.bb.domain.net ex4300-24t [14.1X53-D25.2] Serial# 
device3-e1.bb.domain.net C3750 12.1(14r)EA1a, Serial# 
device4-r0.bb.domain.net m7i [13.3R6.5] Serial# 
... 

に見えるようにしたいどのような

% cver -b 

device1-e0.bb.domain.net ex4300-24t [14.1X53-D25.2] Serial# 
device2-e0.bb.domain.net ex4300-24t [14.1X53-D25.2] Serial# 
awk: can't open file /home/clmbn eng2/a/rwalker/svn/nw_config_data/device3-e1.bb.domain.net/show.chassis.hardware 
input record number 55, file /home/clmbn-eng2/a/rwalker/svn/nw_config_data/device3-e1.bb.domain.net/show.chassis.hardware 
source line number 1 
device4-r0.bb.domain.net m7i [13.3R6.5] Serial# 
... 

私は13のディレクトリを持ちます"show.chassis.hardware"ファイルを持っていないが、必要なすべての情報を持っている "show.version"ファイルを持っているそれでは。ファイルがないディレクトリが1つありますが、そのデバイスは置き換えられるため問題ありません。

私が読んできたことから、awkはこれを行うことができないかもしれませんが、そこにいる誰かがそれを動作させる方法を知っているという信念があります。私のアプローチ(シェル& awkスクリプト)がうまくいかず、何か他のもの(PerlやPythonなど)でやる必要がある場合は、スクリプトを1つに変換するのに十分なことを学ぶまで完全に固執しますそれらの言語の

また、私たちはこのサーバにbashをインストールしていないので、私は管理者ではないので、私たちがいつになるのか分かりません。ファイルが存在し、通常のファイルであれば

答えて

1

です。だからあなたのawkコマンドは次のようになります。

awk -v h=$host '/^Model/{m=$2} ... END {...}' "$hostdir"/show.(version|chassis.hardware) 

(読みやすくするためにawkスクリプトを省略)


私はまた、連想配列の代わりに、例を使用してスクリプトビットを簡素化したい:

#!/usr/local/bin/zsh 

usage() { 
    echo "Help!" # echo your help message here 
    exit $1 
} 

svn="$HOME/svn/nw_config_data/" 

declare -A hosts # make associative array 
hosts["-a"]="" 
hosts["-b"]=".bb.domain.net" 
hosts["-c"]=".cpe.domain.net" 
hosts["-e"]=".etech.domain.net" 
hosts["-k"]=".core.domain.net" 
hosts["-m"]=".maint.domain.net" 
hosts["-o"]=".ohgov.domain.net" 

if [[ $1 == -h ]] 
then 
    usage 
elif ((${+hosts["$1"]})) # check if $1 is a key in hosts 
then 
    echo "Invalid option: $1" 
    usage 1 # exit with status 1 to indicate error 
fi 

dirs=($svn*$hosts["$1"]*) # no need for ls here 
for hostdir in $dirs 
do 
    host=$(echo $hostdir | grep -Eo "(\w|\.|-)*$") 

    awk -v h=$host ' 
     /^Model/{m=$2} 
     /^Model number/{m=$4} 
     /^\*0/{m=$2} 
     /^JUNOS Base OS boot/{v=$5} 
     /^Junos:/{v="["$2"]"} 
     /^BOOTLDR:/{v=$7} 
     /^JUNOS EX Software Suite/{v=$5} 
     /^ROM:/{v=$5} 
     /^JUNOS Software Release/{v=$4} 
     /^Chassis/{s=$2} 
     /^Motherboard serial number/{s=$3} 
     END {if(m!="number") {printf("%s %s %s %s\n",h,m,v,s)}}' \ 
     "$hostdir"/show.(version|chassis.hardware)   
done 

また、caseの簡潔な配列を使用することもできます。

declare -A hosts # make associative array 
hosts["-a"]="" 
hosts["-b"]=".bb.domain.net" 
hosts["-c"]=".cpe.domain.net" 
hosts["-e"]=".etech.domain.net" 
hosts["-k"]=".core.domain.net" 
hosts["-m"]=".maint.domain.net" 
hosts["-o"]=".ohgov.domain.net" 
case $1 in 
    -[abcekmno]) dirs=($svn*${hosts["$1"]}*) 
    ;; 
    -h|help) usage 
    ;; 
    *) echo "Invalid option: $1" 
     usage 1 # exit with status 1 to indicate error 
    ;; 
esac 
+0

Beautiful!それはまさに私が探していたものでした。ありがとうございました! – rewalker3

+0

アレイのオプションだけが許可されるように、このコマンドを「ロック」するにはどうすればよいですか?私はまた、これにヘルプコマンドをドロップして、アプローチの確信がないです。このスクリプトはこの数日間進化したので、前の質問で私が何を持っていたかを見ることができます。 https://stackoverflow.com/questions/47049207/combine-multiple-awk-output-to-print-on-one-line – rewalker3

+0

@ rewalker3より一般的なオプションの解析では、zparseoptsまたはgetoptsを調べる必要があります。スクリプトを修正して、これら2つのケースだけを説明しました。 – muru

2

あなたが

-f file

真必要です。あなたが参照することが

if [[ -f "$hostdir/show.version" && -f "$hostdir/show.chassis.hardware" ]]; then 

     # your awk command goes here... 
     awk '{ }' "$hostdir/show.version" "$hostdir/show.chassis.hardware" 
else 
     echo "not enough files found"    
fi 

http://zsh.sourceforge.net/Doc/Release/Conditional-Expressions.html

--edit--

スクリプトのこのビットがファイルを持っていません ディレクトリをスキップしますが、それことをクールですとにかく "show.version"ファイルから情報を引き出し、その情報を印刷しません。したがって、出力 は、device1、device2、device 4を表示します...

$ mkdir foo bar; touch {foo,bar}/show.version foo/show.chassis.hardware 
$ echo foo/show.(version|chassis.hardware) 
foo/show.chassis.hardware foo/show.version 
$ echo bar/show.(version|chassis.hardware) 
bar/show.version 

これはグロブされているので、それが唯一の既存のファイルに展開されます:ここで

あなたはzshのの(...|...)グロブを使用することができるコードスニペット

function myfunc(){ 
    # replace with your awk 
    awk '{ print }' "[email protected]" 
} 

if [[ -f "$hostdir/show.version" && -f "$hostdir/show.chassis.hardware" ]]; then 

     # your awk command goes here... 
     myfunc "$hostdir/show.version" "$hostdir/show.chassis.hardware" 
else 
     echo "not enough files found" 

     # pass only one file, version file 
     myfunc "$hostdir/show.version"   
fi 
+0

このスクリプトのほうがファイルを持っていないディレクトリをスキップしますが、 "show.version"ファイルから情報を取り出してその情報を出力するわけではありません。出力はdevice1、device2、device 4 ... – rewalker3

+0

を表示します。私の編集を参照し、1つの引数でelseブロックを呼び出します。 –

+0

応答をありがとう!できるだけ早くそれを行って報告します。 – rewalker3

関連する問題