2008-12-05 16 views
2

J'ai un fichier qui a une entrée par ligne. Chaque ligne a le format suivant:l'analyse d'une ligne dans bash

"group:permissions:users" 

les autorisations et les utilisateurs pourraient avoir plus d'une valeur séparées par des virgules comme ceci:

"grp1:create,delete:yo,el,ella" 

que je veux est de retourner les éléments suivants:

yo 
el 
ella 

C'est ce que j'ai jusqu'à présent:

cat file | grep grp1 -w | cut -f3 -d: | cut -d "," -f 2 

Renvoie yo,el.ella, Comment puis-je le faire retourner une valeur par ligne?

Répondre

7

Vous pouvez utiliser awk, avec l'option -F à utiliser: comme séparateur de champ:

[[email protected]]$ echo "grp1:create,delete:yo,el,ella" | awk -F ':' '{print $3}' 
yo,el,ella 

que vous obtiendrez seulement la chaîne des utilisateurs, séparés par des virgules. Ensuite, vous pouvez faire ce que vous voulez avec cette chaîne. Si vous voulez imprimer littéralement chaque utilisateur une ligne par, vous pouvez utiliser tr pour remplacer les virgules avec les nouvelles lignes:

[[email protected]]$ echo "grp1:create,delete:yo,el,ella" | awk -F ':' '{print $3}' | tr ',' '\n' 
yo 
el 
ella 
+0

merci vous qui le fera. il n'a jamais croisé mon ming pour utiliser awk .... merci encore –

+0

chose sûre ... c'est probablement faisable avec * juste * awk, mais mon awk-fu est sévèrement limité;) – Jay

+0

haha ​​exactement ce que j'aurais répondu aussi. +1 –

1

est ici une façon de le faire entièrement dans un script shell. Vous avez juste besoin de changer IFS pour l'obtenir pour casser des "mots" sur les bons caractères. Remarque: Ceci ne gérera pas les échappements (par exemple ":" dans certains formats de fichier).

Ceci est écrit pour vous permettre de le faire:

cat file | name-of-script 

Le script:

#!/bin/bash 
while IFS=: read group permissions users; do 
    if [ "$group" = "grp1" ]; then 
    IFS=, 
    set -- $users 
    while [ $# -ne 0 ]; do 
     echo $1 
     shift 
    done 
    fi 
done