2010-12-07 50 views
1

Disons que j'ai un fichier qui ressemble à ceci:scripts Shell et des expressions régulières (? Sed, awk, grep ...)

user ID time started time ended yes/no 
3523   15:00   0  yes 
2356   12:13  12:18  yes 
4690   09:10   0  no 

Je veux écrire script shell qui choisir tous les lignes dans le fichier que ont un temps terminé de '0' et 'oui'.

Pour cet exemple, ce serait la première ligne seulement:

3523  15:00  0  yes 

Répondre

3

awk '$3 == "0" && $4 == "yes" { print; }' myfile

+0

Wow, je ne savais pas comment cela est simple à faire avec awk. En tant que question secondaire avant la déclaration d'impression devez-vous écrire END? –

+2

Jetez un oeil à la page de man pour awk. Un script awk est essentiellement une liste de paires CONDITION ACTION. Dans ce cas, la condition est 3 $ = 0 et 4 $ = oui. L'action correspondante est print. END est une condition qui est vraie après la lecture de la dernière ligne du fichier. Ainsi, toutes les actions placées après cela n'auront lieu qu'à la fin du fichier. À ce stade, l'impression n'aura aucune ligne à afficher. En pratique, d'autres clauses auraient stocké des valeurs dans les globales pour les actions de END à utiliser. – jtdubs

+2

Lorsque vous vous sentez à l'aise avec awk, vous pouvez supprimer le corps '{print}' (qui est l'action par défaut): 'awk '$ 3 == 0 && $ 4 ==" oui "' fichier' –

1
grep -E '^[^ ]+ +[^ ]+ +0 +yes$' inputfile 

ou

grep -E '^([^ ]+ +){2}0 +yes$' inputfile 

ou

sed -n '/^\([^ ]\+ \+\)\{2\}0 \+yes$/p' inputfile 

ou

sed -nr '/^([^ ]+ +){2}0 +yes$/p' inputfile 
1

Cela pourrait fonctionner pour vous:

sed '/\s0\s\+yes\s*$/!d' inputfile 
1

ceci fonctionne aussi bien

grep '............................0........yes' myfile

+1

C'est terrible, mais je lol'd. –