UNIX - WINSCP

helmetpastoralΛογισμικό & κατασκευή λογ/κού

13 Δεκ 2013 (πριν από 3 χρόνια και 7 μήνες)

214 εμφανίσεις


1

UNIX
-

WINSCP



FILE DI GROSSE DIMENSIONI

Se dovete aprire file txt molto grandi dell'ordine persino fino a GB, con l'Ultraedit o l'EditPlus si blocca
il pc. Si può ovviare al problema usando il programmino in allegato LISTER. Non bisogna installarlo ma
è
subito eseguibile. Molto comodo per i file dati.



REGOLE DA SEGUIRE SEMPRE PER UNIX

1) Eliminare tutti i file inutili

2) Zippare tutti i file > 1MB e < 2GB (limite del .ZIP)

3) Gzippare tutti i file > 2GB (.GZ)



GZIP

In UNIX (anche in windows) lo zip ha
il limite di dimensione del file di 2GB.

Per ovviare a tale problema esiste l'istruzione GZIP che crea un file .gz

NB: a difenderenza dello zip, il gzip

elimina automaticamente il file di partenza e lascia solo il .gz inoltre
è più lento (diversi minuti pe
r giga).



CON IL PUTTY:

gzip NomeFile.ext






Per estrarre:



gunzip NomeFile.gz



Con WINSCP:




2












PER FILE MOLTO grandi il winscp mentre zippa sembra sconnettersi con questo messaggio


3




bisogna attendere e per verificare che abbia finito
si può aprire un'altro winscp

e premendo il refresh
(CTRL+R)


non cambia la dimensione del file







Comando per aggiungere una stringa di caratteri dopo una certa
colonna di un file di testo:


perl
-
pi.bak
-
e 's/^([^ç]{<colonna dopo la quale partire>})(
.*)$/sprintf($1."<stringa da inserire>".$2)/eg' <nome del file origine>


Problema di esempio:

Contenuto del file di origine
-

Dati_origine.txt


*

XY19990601619900000P200403050203374076 2204,70 626,95
F 1999102720000103 0030200403050 2

XY19990601839300000 000000000112756088 63,83 F 19991130200002282 003000000000

1


XY19990601991500000 000000000113463075 60,74 F 19991224200003232 003000000000

1 4040499999999999999999

XY19990601991600000 000000000113463075 1450,21 F
19991224200003232 003000000000 1 4040499999999999999999



Il problema è aggiungere
-
A01 dopo la colonna 39 (*) in modo che il file diventi come segue:


Contenuto del file di destinazione

XY19990601619900000P20040305020337407
-
A01 2204,70 626,95F 1999102720000103 0030200403050 2

XY19990601839300000 00000000011275608
-
A01 63,83 F 19991130200002282

003000000000 1

XY19990601991500000 00000000011346307
-
A01 60,74 F 19991224200003232 003000000000 1

4040499999999999
999999

XY19990601991600000 00000000011346307
-
A01 1450,21 F 19991224200003232 003000000000 1

4040499999999999999999


il comando da lanciare è:

perl
-
pi.bak
-
e 's/^([^ç]{39})(
.*)$/sprintf($1."
-
A01".$2)/eg' Dati_origine.txt




Si possono spostare

i file direttamente da UNIX ad FTP tramite il
comando unix ftp.

Procedura:

Posizionarsi nella cartella unix desiderata.



1)>ftp














--
apre la console ftp

2)
> open IP_destinazione


--

crea un collegamento con l'host FTP

3)>user














--
viene richiesto user e password del sito FTP

4)>cd cartella_destinazione

5)>bin

--
prepara il trasferimento in modo binario,

evita problemi di conversione unix
-
windows



Ora è possibile copiare i file con:


4

>put nomefile
--

copia nomefile dalla cartella unix a quella ftp

>get nomefile
--

copia nomefile da ftp a unix





script per il caricamento degli errori emigall nella tabell
a
TMP_ERRORI_EMIGALL (per

ora esiste solo su TEST1).


DA UNIX:



perl $HOME/err_emigall.pl


<nome_file>


<utente_DB>




esempio:



perl $HOME/err_emigall.pl


partn_chan_err.txt


test1





oppure


CON WinSCP (versione


3.7.1 o superiore):

-

create un

Custom Command (Option
-
>Preferences
-
>Commands) con questi dati:



Description: Carica Errori



Custom Command: perl $HOME/err_emigall.pl !& "!?&schemaDB:?test1!"


-

portate sotto unix un file di errori

-

sul file degli errori, click
-
destro
-
>Cu
stom Commands
-
>Carica Errori



Eliminare le prime 700 righe di 500 file





Ho 500 file, dovrei fare questa operazione:


> aprirli tutti, cancellare le prime 700 righe, cancellare le ultime 400

> riche e salvarli. Qualcuno da indicarmi se esiste un metodo co
n

> qualche editor per automizzare il tutto. Grazie


--
8<
---------------
cut here
---------------
start
-------------
>8
---

#!sh

for f in * ; do

linee=$(tail +701 $f|wc
-
l)

tail +701 $f|head
-
n $(($linee
-
400))>$f

done

--
8<
---------------
cut here
---------------
e
nd
---------------
>8
---


se sei su windows e ti mancano "gli attrezzi", scaricati le unxutils

(3,2M). se vuoi ti mando uno zip con i soli 4 tool necessari.





5

1.

Se si deve lanciare uno script in background in unix e si vuole ottenere un file di spool con
nome

diverso dal solito nohup.out (che potrebbe contenere anche lo spool di script lanciati da
altri) si può fare così:

nohup ./nomescript.bat > nohup_nomescript.out &

2.

Per la schedulazione (operazione pianificata), cioè il lancio di uno script ad una determina
ta ora
si può usare l'istruzione at:

EX: at
-
f nomebacth.sh
-
t 200412010100


(la data:aaaammgghhmm )


at
-
r idbatch >> per eliminarlo

3.

Per controllare in UNIX l'utilizzo della CPU dai vari processi (nel Solaris ci

sono 4 CPU) entrare
con putty e lanciare:

p
rstat



NB:

IL numero
PID

corrisponde al numero
SPID

che si può leggere sul Session Browser del

TOAD
in corrispondenza del processo.

Mentre il
PROCESS

del TOAD corrisponde al numero del processo che si ottiene con

ps
-
efa|grep sqlplus (nel ex per i 3 pro
cessi:1952,2931,1991)


Per Killare ad ex il secondo processo: kill
-
9 2931

ctrl+c per uscire

4.

Per Controllare la disponibilità della CPU usare:

iostat 2 1000


(cioè legge ogni 2 secondi per 1000 volte)


Esaminare le ultime 4 colonne:

us: % cpu usata dagl
i utenti

sy: % cpu usata dal sistema

wt: % cpu in stato di wait, quindi disponibile

id: % cpu in idle quindi disponibile




6

INVIO A CAPO


Tutti i file creati in ambiente
Windows

sono in formato DOS che hanno

la caratteristica di avere l'elemento di "ritorno

a capo" come 2 "caratteri" ascii:



CR


Carriage Returns (ritorno a capo)
-

cod.Ascii:32

+

LF


Line Feed (avanzamento di una riga)
-

cod.Ascii:10



mentre sotto
UNIX

esiste solo il
LF (
^M
)
.



Problema
:

In operazioni di
caricamento dei dati

da file asci
i con il
sqlldr

ci sono problemi nel caricamento dell'ultimo
campo che porta a volta allo scarto totale dei dati.



Soluzione1
:

Con l'ftp portare il file Ascii in locale (se sono pesanti usare: zip nome.zip

nome.txt e unzip nome.zip) e aprire
con:

Ultraedi
t >> File >> Conversions >> Dos to UNIX

Ediplus >> Document >> File Format (CR/LF) >> Unix

Per l'ftp in generale usare il protocollo
Binary

che non fa mai variare il formato.



Soluzione2
:

(
più veloce

e soprattutto utile quando i file ascii sono molto pesa
nti)

sotto UNIX eseguire:

dos2unix nomefiledos.txt nomefileunix.txt

oppure se si vuole trasformare direttamente lo stesso file:

dos2unix nomefile.txt nomefile.txt




WinSCP


CONFIRM


Operazioni lunghe


1) Nel caso di operazioni lunghe ad esempio lo ZIP d
i file molto grandi appare il seguente messaggio e non si
capisce se ha finito oppure no.

In generale basta aspettare abbastanza e poi sparisce ma si può evitare (vedi sotto).






2) Altro problema molto fastidioso è la disconnessione automatica dopo cir
ca 15
-
20 minuti di inutilizzo.

Appare questo messaggio e si perde tempo per la riconnessione.


7




SOLUZIONE
:



1) Clic sulla sessione desiderata e premere
LOAD






Checcare le
ADVANCED OPTIONS




Aumentare il
SERVER RESPONSE TIMEOUT

anche oltre i 100 se
condi




2)

Checcare
SENDING OF NULL SSH PACKETS

e mettere 300


8


Infine cliccare su SAVE per memorizzare le nuove impostazioni



WinSCP
-

definire le cartelle che si desiderano di default.

Ci sono 2 modi:






oppure (più comodo)

una volta che si è nel
la cartella desiderata si può cliccare sull'icona:






Su
http://winscp.net/eng/index.php

è possibile scaricare gratuitamente l'ultima versione di
WinSCP 3.8.2





Dividere un file in file da n righe ciascu
no


Per dividere un file in altri file da N righe (es: 2000), ho fatto questo Custom Command per WinSCP:


split
-
l "!?&
Numero Linee per
File
:?2000
!" ! "!."

EX:

Per dividere un file in file più piccoli da 10000 righe ciascu
no:

split
-
l "!?&
Numero Linee per
File
:?
10000!" ! "!."




9

WINSCP
Dividere un file




COMMANDS >> ADD >>


split
-
l "!?&
Numero Linee per
File
:?
10000!" ! "!."










Se appare questo me
ssaggio attendere e riconnettersi...



Il Risultato finale






10




Per lanciare il PUTTY da WINSCP con autenticazione automatica User/Password

si può fare in modo diverso.

Come indicato nella figura basta flaggare il "Remember session password and pass
it to Pytty'



La prima volta che utilizzi il putty da winscp , lui memorizza username e password

(eviti di visualizzare la password nel comando external application)



http://winscp.net/eng/do
cs/ui_pref_integration




Per lanciare il PUTTY da WINSCP con autenticazione automatica User/Password

bisogna inserire il path di putty con user/pass come parametri in questo modo:



C:
\
Programmi
\
Putty
\
putty.exe
-
ssh 10.11.10.37:22
-
l usrRDTEST
-
pw F1037
RDTEST



su









Ora premendo CTRL+P

oppure cliccando su


11


e si ha:





PER ANDARE NELLA CARTELLA DI LAVORO DI WINSCP:

Cliccare sulla cartella di figura


Copiarsi il path




Andare sul Putty (ctrl+p)

scrivere:

cd (cliccare tasto destro del mouse
che equivale a 'Incolla')







12



Funzionalità molto utile (by Franco) per l'esecuzione di uno script usando semplicemente il tasto
destro del mouse:






Inserire nel CUS
TOM COMMAND:

$HOME/nohup_sqlplus.sh "!?&connection:?test2/test2!" !


Lo script


nohup_sqlplus.sh è presente in $HOME che per

RDTEST è: //home/RDTEST

Contiene la seguente stringa:

nohup sqlplus $1 @$2 >$2.txt &




Per comodità

spostare il Richiamo verso l'a
lto:



A questo punto per eseguire un qualsiasi script basta fare tasto destro sullo script:


13


Inserire USER e PASSWORD



Lo script crea un file di LOG che ha lo stesso nome dello script e con estensione TXT.



CONTEGGIO DIMENSIONI SPOOL


Dopo aver creat
o uno spool TXT è utile verificare se è completo cioè se il numero di righe corrisponde a quello
previsto.

Ad esempio per conoscere il numero di righe del file DEV_EE2T1.txt da 110MB non è il caso di aprirlo perchè
ci vorrebbe molto tempo oltre al fatto ch
e l'editor rischia di bloccarsi.






Su WINSCP lo selezionate, premete F2 e copiatevi il nome del file (CTRL+C)








Cliccate su questa icona oppure premete CTRL+T


14




scrivete:

wc
-

l (nome del file)


(attenzione l è una elle e usare lettere minuscol
e)



quindi:

wc
-

l DEV_EE2T1.txt




Quindi il file DEV_EE2T1.txt ha 338572 righe.




Per il conteggio esatto dei record di un oggetto SAP, cioè fa il conteggio delle righe raggruppate come da
tracciato SAP,

e che in pratica si basa sul conteggio della st
ringa "&ENDE" si può usare il seguente comando:



Aggiungere a
winSCP

il comando personalizzato:
ContaOggetti


$HOME/background.sh grep
-
c "&ENDE" !&




Selezionare i file spool da contare e lanciare il comando




Attendere un po se il file

è molto grande



In uscita si ha un file con nome
output_comando.txt

con i conteggi richiesti


Aprirlo con l'editor



Il codice del file : /home/usrRDTEST/background.sh


:

echo $* > output_comando.txt

date > output_comando.txt

$*


> output_comando.txt &




Se vuoi stra
-
ottimizzare il tip, puoi contare piu' oggetti contemporaneamente e avere un report finale in un file
con tanto di data, prova a selezionare piu' file ed eseguire :
$HOME/background.sh perl
$HOME/conta_oggetti.pl !&


troverai nella stessa cartella un file c
he si chiama
conta_oggetti.txt


Codice del file
conta_oggetti.pl
:






($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;



$year += 1900;



$mon


+= 1;


15



if (length($mon)


== 1 ) {$mon


= "0" . "$mon"


}



if (length($mday) ==

1 ) {$mday = "0" . "$mday" }



if (length($hour) == 1 ) {$hour = "0" . "$hour" }



if (length($min)


== 1 ) {$min


= "0" . "$min"


}



if (length($sec)


== 1 ) {$sec


= "0" . "$sec"


}



$date = "$mday/$mon/$year $hour:$min:$sec";





system("ec
ho 'DATA: $date ' >


conta_oggetti.txt");



system("echo '=========================' >> conta_oggetti.txt");








foreach $arg (@ARGV) {



system("echo '.'


>> conta_oggetti.txt");



system("echo '$arg'


>> conta_
oggetti.txt");



system("grep
-
c '&ENDE'


$arg >> conta_oggetti.txt");



}