2017-11-01 40 views
2

複数のディレクトリにある特定のファイルを検索し、必要な情報を出力する独自のAWKを持つ2つの異なる機能があります。どちらの関数もFILENAMEと私が必要とする特定のフィールドを印刷し、単独でうまく動作します。私はより強固な出力のために一緒にそれらを結合したい。複数のawk出力を1行にまとめる

私はプログラマーではありません。私が行ったときに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ベースの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と言った答えが1つ見えましたが、2番目の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 

入力/出力の例:私は入力/出力になりたい

% 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情報を標準化していないため、近い将来、このスクリプトを拡張して、詳細情報を正確に取得する予定です。このスクリプトはJuniperベースのため、現場に導入したシスコのデバイスはほとんどありません。

"-a"オプションを追加してすべてのホストをプルしました。 dirsセクションでは、選択されているオプション(-b、-c、-eなど)のすべてのホストを表示し、forループでポップして、重複した情報が入力されないようにします。私は後で古いciverからのヘルプと(*)オプションを追加します。

オリジナルの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

関連する問題