AWK를 사용하여 for 루프에서 파일 덮어쓰기

AWK를 사용하여 for 루프에서 파일 덮어쓰기

저는 다음 스크립트를 작성하고 있습니다.

!/bin/bash
FILE1=dispositivoss.csv
NUMERODISP="$(wc -l $FILE1 | awk '{print $1}')"    

for (( c=2; c<=$NUMERODISP; c++ ))
do  
   IP=$(awk -vnum="$c" 'NR == num { print $NF }' dispositivoss.csv)
    expect -f conexionindividual.sh $IP
    SN=$(grep "System serial number" SN_$IP.dat | sed 's/^.*: //')  
    awk -v "ln=$c" -v "sn=$SN" '{print (NR==ln) ? $0","sn : $0;}' <dispositivoss.csv
done

이 스크립트는 "dispositivos.csv"라는 파일의 행 수를 가져옵니다.

이를 기반으로 for 루프를 통해 IP 주소를 획득하고 해당 IP에 텔넷을 통해 연결합니다.

그런 다음 "show version"을 입력하여 출력을 파일에 저장합니다.

grep을 사용하여 "시스템 일련 번호"를 가져오고 awk를 사용하여 "dispositivos.csv"의 해당 줄에 추가합니다.

이것은 conexionindividual.sh입니다:

#!/usr/bin/expect -f
set Username "user" 
set Password "password"
set IP   [lindex $argv 0];
spawn ssh -p 22 cesar@localhost
expect "*?"
send "yes\r"
expect "password: "
send "mycomputerpass\r"
expect "$ "
send "telnet $IP\r"
expect "Username:"
send "$Username\r"
expect "Password: "
send "$Password\r"
expect "*>"
send "show version\r"
log_file -noappend SN_$IP.dat;
expect -ex "--More--" {send -- " "; exp_continue}
expect "*>"
log_file;
expect "*>"
send "exit\r"

모든 것이 잘 진행되고 있지만 마지막 부분인 각 반복의 출력은 다음과 같습니다.

 telnet 148.000.000.253
Trying 148.000.000.253...
Connected to 148.000.000.253.
Escape character is '^]'.

DCyTIC BUAP Solo Usuarios Autorizados. Usuario: user
Password: 

Ingenieria_Posgrado>show version
Cisco IOS Software, C2960 Software (C2960-LANBASE-M), Version 12.2(25)SEE3, RELEASE SOFTWARE (fc2)
Copyright (c) 1986-2007 by Cisco Systems, Inc.
Compiled Thu 22-Feb-07 13:57 by myl
Image text-base: 0x00003000, data-base: 0x00AA3380

ROM: Bootstrap program is C2960 boot loader
BOOTLDR: C2960 Boot Loader (C2960-HBOOT-M) Version 12.2(25r)SEE1, RELEASE SOFTWARE (fc1)

Ingenieria_Posgrado uptime is 19 weeks, 4 days, 20 hours, 8 minutes
System returned to ROM by power-on
System restarted at 14:49:42 gmt Sat Nov 5 2016
System image file is "flash:c2960-lanbase-mz.122-25.SEE3/c2960-lanbase-mz.122-25.SEE3.bin"

cisco WS-C2960-24TC-L (PowerPC405) processor (revision E0) with 61440K/4088K bytes of memory.
Processor board ID FOC1128W4DD
Last reset from power-on
1 Virtual Ethernet interface
24 FastEthernet interfaces
2 Gigabit Ethernet interfaces
The password-recovery mechanism is enabled.

64K bytes of flash-simulated non-volatile configuration memory.
Base ethernet MAC Address       : 00:1C:F9:AA:52:00
Motherboard assembly number     : 73-9832-07
Power supply part number        : 341-0097-02
Motherboard serial number       : FOC1128255N
Power supply serial number      : AZS1128084Q
Model revision number           : E0
Motherboard revision number     : A0
Model number                    : WS-C2960-24TC-L
System serial number            : FOC1128W4DD # HERE WE HAVE THE SN
Top Assembly Part Number        : 800-26671-03
Top Assembly Revision Number    : A0
Version ID                      : V03
CLEI Code Number                : COM3K00BRB
Hardware Board Revision Number  : 0x01


Switch   Ports  Model              SW Version              SW Image            
------   -----  -----              ----------              ----------          
*    1   26     WS-C2960-24TC-L    12.2(25)SEE3            C2960-LANBASE-M     


Configuration register is 0xF

Ingenieria_Posgrado>device_id,ip_address
 BIOTERIO, 148.000.00.189                  #this is dispositivoss.csv
 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,FOC1128W4DD  #HERE IT IS
 Biblio_Barragan, 148.000.000.61
 Electronica_Edif_3, 148.000.000.253
spawn ssh -p 22 cesar@localhost
cesar@localhost's password: 
Permission denied, please try again.
cesar@localhost's password: 
Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 3.13.0-108-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

206 packages can be updated.
119 updates are security updates.

New release '16.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

Last login: Thu Mar 23 11:00:39 2017 from localhost

작업을 수행하지만 터미널에 인쇄만 하고 스크립트가 완료되면 dispositivoss.csv를 확인하면 아무 것도 변경되지 않습니다. 이와 같이:

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

나는 문제가 awk에 있다는 것을 알고 있습니다. SN을 동일한 파일에 보관하고 싶습니다. 내가 시도한 것은 다음과 같습니다.

awk -v "ln=$c" -v "sn=$SN" '{print (NR==ln) ? $0","sn : $0;}' dispositivoss.cvs

awk -v "ln=$c" -v "sn=$SN" '{print (NR==ln) ? $0","sn : $0;}' dispositivoss.cvs>dispositivosfinal.csv

awk -v "ln=$c" -v "sn=$SN" '{print (NR==ln) ? $0","sn : $0;}' dispositivoss.cvs

awk -v "ln=$c" -v "sn=$SN" '{print (NR==ln) ? $0","sn : $0;}' dispositivosfinal.csv<dispositivoss.cvs   

awk -v "ln=$c" -v "sn=$SN" '{print (NR==ln) ? $0","sn : $0;}'<<dispositivoss.cvs

해결됨:

awk -v "ln=$c" -v "sn=$SN" '{print (NR==ln) ? $0","sn : $0;}' dispositivoss.csv>dispositivosfinal.csv   
mv dispositivosfinal.csv dispositivoss.csv

감사해요.

답변1

dispositivoss.csv귀하의 질문을 이해하면 입력 파일이 변경되지 않는 이유를 알고 싶습니다 . awk의 명령이 입력 파일을 수정한다고 생각하는 것 같지만 print사실은 아닙니다.

다음을 시도하는 것이 좋습니다.

for IP in $(awk 'NR > 1 { print $NF }' dispositivoss.csv)
    do expect -f conexionindividual.sh $IP
done | awk 'BEGIN { print } /System serial number/ { print $NF }' > temp_file
paste -d, dispositivoss.csv temp_file

관련 정보