The UNIX and Linux Forums  
Ciao e benvenuto da parte degli Stati Uniti al UNIX e Linux Forum! Grazie per la visita ed unirsi alla nostra Comunità Globale.

Go Back   UNIX e Linux Forum > Inizio Forum > Shell scripting e di programmazione
.
google unix.com



Shell scripting e di programmazione Pubblica domande su KSH, CSH, SH, Bash, Perl, PHP, sed, awk e da altri script di shell e linguaggi di scripting shell qui.

Più di UNIX e Linux Forum Argomenti potreste trovare utili
Filo Thread Starter Forum Risposte Ultimo Post
Come leggere il record dal record da un file in UNIX raoscb UNIX for Dummies Domande & Risposte 1 05-16-2008 07:30 AM
Script per cercare un record negativo in un file poi il record nel file di cattivo shilendrajadon Shell scripting e di programmazione 2 12-28-2007 10:02 AM
Script per cercare un record negativo in un file poi il record nel file di cattivo shilendrajadon UNIX e avanzata per utenti esperti 1 12-28-2007 10:00 AM
frazionamento un record e l'aggiunta di un record in un file rsolap Shell scripting e di programmazione 1 08-13-2007 02:58 PM
Selezionare il testo all'interno di corrispondenza () parentesi corsivo UNIX for Dummies Domande & Risposte 4 04-20-2007 03:14 AM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Cerca in questo Thread Rate Thread Modalità di visualizzazione
  #1 (permalink)  
Old 06-05-2008
synmag synmag is offline
Utente Registrato
  
 

Iscriviti Data: giugno 2008
Interventi: 3
selezionare un record da un file corrispondenti dal secondo file utilizzando awk

Ho bisogno di aiuto

Ho due file di ingresso e vorrei creare una relazione basata su due.

Filea:
hostname, account1, la password
, account2, la password
hostname, account1, la password
hostname, account1, la password
, account1, la password
, account2, la password

ripetendo i nomi host sono vuoti

fileb:
Hosta
HostB
hostc

Ho bisogno di generare un record di "hostname password" per tutti gli host che si verificano in fileb in Filea per un account specifico. Vale a dire che voglio una lista di password di root per tutti gli host in fileb. So che la logica che voglio usare, ma non hanno la capacità di scripting per la sua attuazione. Penso che il modo più semplice sarebbe quella di usare awk per riempire gli spazi vuoti con il nome di Filea e poi semplicemente utilizzare uno script di shell a grep per ogni host nel fileb del nuovo Filea.

L'altro modo è quello di correre verso il basso Filea per ogni host nel fileb fino trovato il conto è l'hostname o è diverso e stampare il risultato. Se l'account non esiste per l'hostname dato non fare nulla.

Sto cercando di salvare manualmente questo script da pensare che sarebbe più veloce, ma forse è stato sbagliato

Ecco il quadro mi si avvicinò con finora per la strada più difficile, perché sarebbe più elegante

#! / bin / sh
#
host \u003d `cat hosts.txt»
hostname \u003d "x"
ultimo \u003d "x"

per nome in $ (host)
fare
# awk la logica sarebbe venuto qui
fatto
  #2 (permalink)  
Old 06-05-2008
lo tan lo tan is offline
Utente Registrato
  
 

Iscriviti Data: maggio 2008
Posti: 8
ci si può dare un esempio del risultato che si tenta di raggiungere e su tale base si può trovare una soluzione.
  #3 (permalink)  
Old 06-06-2008
epoca era is offline Forum Advisor  
Herder di Inutile Gatti (Su sabbatico)
  
 

Iscriviti Data: marzo 2008
Ubicazione: / ci / è / solo / bin / sh
Interventi: 3.652
Vuoi dire qualcosa come questo?

Codice:
sed -e 's/.*/^&,/' fileb | grep -f - filea
Non tutti i grep sostenere le versioni -f opzione in apparenza, ma l'idea è semplicemente quella di grep per niente fileb che è il primo campo di Filea.
  #4 (permalink)  
Old 06-06-2008
synmag synmag is offline
Utente Registrato
  
 

Iscriviti Data: giugno 2008
Interventi: 3
Citazione:
Originalmente inviato da epoca View Post
Vuoi dire qualcosa come questo?

Codice:
sed -e 's/.*/^&,/' fileb | grep -f - filea
Non tutti i grep sostenere le versioni -f opzione in apparenza, ma l'idea è semplicemente quella di grep per niente fileb che è il primo campo di Filea.
Grazie per la risposta. La mia versione non supporta-f purtroppo. Guardando il codice in cui si specificare il nome dell'account che sto cercando? Voglio dire, se alla lista di accoglienza, account, password di root per tutti gli account? Anche per questo lavoro sarebbe record in cui il nome host è vuoto?

Per chiarire il problema, ha Filea sbozzi per ripetere i nomi host e dire se è radice di un record in cui non vi è alcun nome come si fa a ricavare il nome host per il record? Il nome host che sto cercando non è la prima registrazione in bianco.

esempio:

Hosta, mariorossi, abc123
, root, 4009dlkj
HostB, janedoe, rrrrrr

se l'host si trova in uno fileb atteso per mettere fuori radice è

Hosta, radice, 4009dlkj

Ho cercato di usare awk per sostituire il bianco con un hostname nonblank dal precedente, ma ho continuato a registrare errori. Non ho potuto anche memorizzare $ 1 ad una variabile e stamparlo come un banco di prova. So sed è molto potente ma non pensa che questo potrebbe essere fatto con una sola riga.

Ho finito per farlo manualmente la notte scorsa. A questo punto è curioso menti vogliono conoscere e che potrebbe rivelarsi utile, se devo farlo di nuovo.

TIA
  #5 (permalink)  
Old 06-06-2008
reborg's Avatar
reborg reborg is offline Forum Staff  
Administrator
  
 

Iscriviti Data: marzo 2005
Luogo: Irlanda
Messaggi: 4.216
Citazione:
Originalmente inviato da epoca View Post
Non tutti i grep sostenere le versioni -f opzione in apparenza, ma l'idea è semplicemente quella di grep per niente fileb che è il primo campo di Filea.
Vero, ma la maggior parte che non sosterrà né egrep-f o fgrep.
  #6 (permalink)  
Old 06-09-2008
epoca era is offline Forum Advisor  
Herder di Inutile Gatti (Su sabbatico)
  
 

Iscriviti Data: marzo 2008
Ubicazione: / ci / è / solo / bin / sh
Interventi: 3.652
Oh, ho frainteso la tua descrizione del problema. Qui c'è qualcosa che si spera sia più vicino a ciò che si voleva.

Codice:
awk -F , -v acct=root 'NR==FNR { h[$1]++; next; }
{ if($1 == "") $1=host; host=$1; if (! h[$1]) next;
if ($2 == acct) print }' fileb filea
Il NR \u003d\u003d FNR la condizione è vera, mentre fileb è la lettura. Questo è un comune awk linguaggio per la lettura in un file di dati prima della ausiliari principali. I nomi degli host in fileb saranno utilizzati per popolare l'array h. Poi, nel corpo principale dello script, se il primo campo è vuoto, il valore della ospite variabile sarà utilizzata per $ 1. Quindi, il valore attuale di $ 1 sarà ricordato nel ospite nel caso in cui la riga successiva (s) sono campi vuoti prima. Poi, se l'array h non contiene il nome host corrente (il che significa che non era presente in fileb), L'attuale linea è saltato. Infine, se il secondo campo è identica a quella variabile acct, La linea viene stampata.

(Really vecchie varianti di awk non supportano passa le variabili con il -v opzione - se avete questo problema, vedere se si può trovare nawk o mawk o gawk sul proprio sistema, o un XPG4 awk. Oppure si può interpolare direttamente la variabile nello script.)
  #7 (permalink)  
Old 06-11-2008
synmag synmag is offline
Utente Registrato
  
 

Iscriviti Data: giugno 2008
Interventi: 3
Citazione:
Originalmente inviato da epoca View Post
Oh, ho frainteso la tua descrizione del problema. Qui c'è qualcosa che si spera sia più vicino a ciò che si voleva.

Codice:
awk -F , -v acct=root 'NR==FNR { h[$1]++; next; }
{ if($1 == "") $1=host; host=$1; if (! h[$1]) next;
if ($2 == acct) print }' fileb filea
Il NR \u003d\u003d FNR la condizione è vera, mentre fileb è la lettura. Questo è un comune awk linguaggio per la lettura in un file di dati prima della ausiliari principali. I nomi degli host in fileb saranno utilizzati per popolare l'array h. Poi, nel corpo principale dello script, se il primo campo è vuoto, il valore della ospite variabile sarà utilizzata per $ 1. Quindi, il valore attuale di $ 1 sarà ricordato nel ospite nel caso in cui la riga successiva (s) sono campi vuoti prima. Poi, se l'array h non contiene il nome host corrente (il che significa che non era presente in fileb), L'attuale linea è saltato. Infine, se il secondo campo è identica a quella variabile acct, La linea viene stampata.

(Really vecchie varianti di awk non supportano passa le variabili con il -v opzione - se avete questo problema, vedere se si può trovare nawk o mawk o gawk sul proprio sistema, o un XPG4 awk. Oppure si può interpolare direttamente la variabile nello script.)
Questo è esattamente ciò che volevo. La mia versione di awk non ha sostenuto il passaggio della variabile, ma ho nawk e ha funzionato perfettamente.

Basato su awk documentazione ho cercato di utilizzare il blocco di iniziare a leggere il file, ma non poteva capire come leggere da due file. Esprimi la tua mente spiega come awk determina che il file da leggere? E 'il codice nel primo set di parentesi graffe () recita il primo file forniti e la seconda serie il secondo file?

Grazie. Ho imparato molto da questo!
Closed Thread

Segnalibri

Thread Tools Cerca in questo Thread
Cerca in questo Thread:

Ricerca Avanzata
Modalità di visualizzazione Vota questo thread
Vota questo thread:

Distacco regolamento
Tu non può post nuovo thread
Tu non può inviare una risposta
Tu non può postare allegati
Tu non può modificare i tuoi post

BB codice è Su
Smilies sono Su
[IMG] codice Su
Codice HTML è Chiuso
Trackbacks sono Su
Pingbacks sono Su
Refbacks sono Su




Tutti gli orari sono GMT -4. La data di oggi è 11:08 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traduzioni Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX e Linux Forum Content Copyright © 1993-2009. Tutti i diritti Reserved.Ad di gestione da RedTyger

Contenuti pertinenti URL da vBSEO 3.2.0