다음과 같은 .dat 파일이 있습니다.
show version
Cisco IOS Software, C2960 Software (C2960-LANBASE-M), Version 12.2(35)SE5, RELEASE SOFTWARE (fc1)
Copyright (c) 1986-2007 by Cisco Systems, Inc.
Compiled Thu 19-Jul-07 20:06 by nachen
Image text-base: 0x00003000, data-base: 0x00D40000
ROM: Bootstrap program is C2960 boot loader
BOOTLDR: C2960 Boot Loader (C2960-HBOOT-M) Version 12.2(25r)SEE6, RELEASE SOFTWARE (fc1)
Electronica_Edif_3 uptime is 17 weeks, 6 days, 0 minutes
System returned to ROM by power-on
System restarted at 13:04:50 gmt Thu Nov 10 2016
System image file is "flash:c2960-lanbase-mz.122-35.SE5/c2960-lanbase-mz.122-35.SE5.bin"
cisco WS-C2960-48TC-L (PowerPC405) processor (revision F0) with 61440K/4088K bytes of memory.
Processor board ID FOC1235Z1W5
Last reset from power-on
2 Virtual Ethernet interfaces
48 FastEthernet interfaces
2 Gigabit Ethernet interfaces
--More-- The password-recovery mechanism is enabled.
64K bytes of flash-simulated non-volatile configuration memory.
Base ethernet MAC Address : 00:23:05:46:8B:00
Motherboard assembly number : 73-9835-09
Power supply part number : 341-0097-02
Motherboard serial number : FOC12351HVZ
Power supply serial number : AZS123206WY
Model revision number : F0
Motherboard revision number : A0
Model number : WS-C2960-48TC-L
System serial number : FOC1235Z1W5
Top Assembly Part Number : 800-26672-04
Top Assembly Revision Number : A0
Version ID : V04
CLEI Code Number : COM3F00BRC
Hardware Board Revision Number : 0x02
Switch Ports Model SW Version SW Image
------ ----- ----- ---------- ----------
* 1 50 WS-C2960-48TC-L 12.2(35)SE5 C2960-LANBASE-M
--More--
Configuration register is 0xF
Electronica_Edif_3>
시스템 일련 번호를 파악하여 다음과 같이 .cvs의 줄 끝에 추가하고 싶습니다.
device_id,ip_address
BIOTERIO, 148.000.00.189
N7K-LAN(JAF1651ANDL), 148.000.0.192
LAB_PESADO, 148.000.000.130
Arquitectura_Salones, 148.000.000.61
CIVIL_253, 148.000.000.253
Arquitectura, 148.000.000.253
ING_CIVIL, 148.000.000.251
ING_CIVIL_DIR, 148.000.0.188
Ingenieria_Posgrado, 148.000.000.253
Biblio_Barragan, 148.000.000.61
Electronica_Edif_3, 148.000.000.253
예를 들어, 이 경우 SN을 추출하여 12행에 추가하고 싶습니다(변수에 이 숫자가 이미 있습니다). 다음과 같아야 합니다.
device_id,ip_address
BIOTERIO, 148.000.00.189
N7K-LAN(JAF1651ANDL), 148.000.0.192
LAB_PESADO, 148.000.000.130
Arquitectura_Salones, 148.000.000.61
CIVIL_253, 148.000.000.253
Arquitectura, 148.000.000.253
ING_CIVIL, 148.000.000.251
ING_CIVIL_DIR, 148.000.0.188
Ingenieria_Posgrado, 148.000.000.253
Biblio_Barragan, 148.000.000.61
Electronica_Edif_3, 148.000.000.253,FOC1235Z1W5
도와주세요?
SN을 grep하여 변수에 저장하는 방법을 알고 있습니다.
SN="grep "System serial number" SN_148.228.130.253.dat | sed 's/^.*: //'"
하지만 주어진 행에 추가하는 방법을 모르겠습니다.
답변1
한 줄은 아니지만 이해하기 쉽습니다. 라인 번호와 시퀀스 번호를 최종 awk
호출에 변수로 전달하기만 하면 됩니다. 줄 번호가 일치하는지 확인하고 일치하는 경우 추가 정보를 추가하세요!
#!/bin/sh
line=12
sn=$(awk '/System serial number/ {print $5}' SN_148.228.130.253.dat)
awk -v "ln=$line" -v "sn=$sn" '{print (NR==ln) ? $0","sn : $0;}' csvfile
답변2
이것은 작동하며 추가 grep이 필요하지 않습니다. 일련번호는 datfile로 추출되어 하나의 스크립트로 csv 파일에 추가됩니다.
#!/bin/bash
line=12
awk -v line=$line 'BEGIN{FS=":"}NR==FNR{if ($1 ~ /System serial number/) \
{sn=$2;nextfile} else {next}}{FS=",";if (FNR==line) $0=$1 FS $2 FS sn}1' datfile cvsfile