Mon fichier d'entrée est comme ça:
IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher
J'utilise sed pour extraire tous les IDno et le type uniquement lorsque le type est student.
sed -e '/IDno=/b' -e '/Type=Student/b' d
Cela me donne toutes les lignes avec le type student mais pas le IDnos.
Je veux obtenir
IDno="1"
Type=Student
IDno="2"
mais j'obtiens
Type=Student
Qu'est-ce que je fais mal?
egrep
peut obtenir plusieurs lignes d'un fichier. En utilisant un tuyau |
comme séparateur, vous pouvez extraire autant de critères que vous le souhaitez. egrep
est l'équivalent de grep -E
. egrep
est un script trouvé dans le dossier /bin
avec le contenu pointant vers exec grep -E "$@"
.
Exemple:
egrep "IDno=|Type=Student" inputfile
ou
grep -E "IDno=|Type=Student" inputfile
Devrait-il produire:
IDno="1"
Type=Student
IDno="2"
J'espère que cela t'aides!
Avec sed
, pour imprimer des lignes spécifiques, il est plus facile d'utiliser l'option -n
et la commande p
:
sed -rn '/IDno=|Type=Student/p'
Ou:
sed -n -e '/IDno=/p' -e '/Type=Student/p'
L'option -n
supprime la sortie sauf si explicitement imprimée. La commande p
imprime bien sûr les lignes correspondantes.
awk
:
Définissez le séparateur de champ sur =
et imprimez les enregistrements contenant Type=Student
en tant qu'enregistrement complet ou IDno
en tant que premier champ:
awk -F= '$1=="IDno" || $0=="Type=Student"'
Perl
:
Imprimer les lignes commençant par IDno
suivi de =
ou par Type
, suivi d'un =
et se terminant par Student
:
Perl -ne 'print if /^(IDno=|Type=Student$)/'
Exemple:
% cat file.txt
IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher
% awk -F= '$1=="IDno" || $0=="Type=Student"' file.txt
IDno="1"
Type=Student
IDno="2"
% Perl -ne 'print if /^(IDno=|Type=Student$)/' file.txt
IDno="1"
Type=Student
IDno="2"
La question initiale semble demander "pour extraire tous les IDno et le type niquement lorsque type est student." Mais l'exemple la sortie renvoie toutes les lignes IDno =, ce qui est plutôt contradictoire ...
Voici une réponse qui renvoie uniquement les IDno et Type lorsque Type = Student.
sed -n 'N;N;/IDno=.*Type=Student/p' filename | grep -v "^Name="
Une petite explication:
-n, --quiet, --silent
supprime l'impression automatique de l'espace de motifN;N;
Lire/ajouter la ligne d'entrée suivante dans l'espace modèle. (deux fois)/IDno=.*Type=Student/p
recherche et impression de IDno = à Type = Student| grep -v "^Name="
ne pas afficher le nom = ligneJe n'aime pas sed | grep, mais je ne sais pas trop comment faire pour que Sed recherche à nouveau sa sortie, et un tuyau indique généralement "prend cette sortie et fait quelque chose" ... Peut aussi faire grep | sed
grep -v "^Name=" t | sed -n 'N;N;/IDno=.*Type=Student/p'