example.txt est ci-dessous
Restaurant: McDonalds
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911
Restaurant: 5 guys
City: Atlanta
State: Georgia
Address: 123 Peachtree Rd
Phone: 911
Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911
Im utilisant le script bash et disons que je veux rechercher un restaurant par son nom dans le fichier ci-dessus. Demandez à l'utilisateur de saisir le nom du restaurant et il devrait imprimer les informations concernant ce restaurant (5 lignes).
awk '/McDonalds/> /KFC/' example.txt
Je sais que la ligne de code ci-dessus imprimera la ligne entière qui correspond au modèle "McDonalds" et "KFC" mais cela imprimera simplement la 1ère ligne du fichier texte mais pas le reste des informations sur ce restaurant. Comment puis-je lui dire d'imprimer toutes les informations (5 lignes) à partir de la seule entrée utilisateur du nom du restaurant?
En utilisant
sed
:Explication
Il s'agit d'une
sed
fonction de base , vous pouvez consulter des SCRIPTS D'UNE LIGNE UTILES POUR SEDla source
La commande ci-dessus récupérera et imprimera les 4 lignes consécutives avec la ligne actuelle car elle a été introduite dans une boucle for. Le modèle de recherche
$2=="KFC"
aidera à obtenir une ligne particulière à partir de plusieurs lignes.la source
Une autre solution possible:
la source
{if($1=="KFC")print $0}
peut être condensé à juste$1 == "KFC"
, car l'action par défaut pour une vraie condition est d'imprimer l'enregistrement.Il suffit d'imprimer à partir de la ligne contenant le nom que vous voulez, jusqu'à la dernière ligne contenant le mot
Phone
(en supposant bien sûr que toutes les entrées suivent le même modèle et auront toujoursPhone
comme enregistrement de fin)Si nous voulions compliquer un peu les choses, nous pourrions imprimer exactement 5 lignes après le match, comme ceci:
La
stop
variable ne sera pas définie, doncNR<=stop
n'imprimera rien, jusqu'à ce/McDonalds/{stop=NR+5;}
qu'une partie définisse réellement la variable, et cela ne se produira que lorsque nous trouverons la correspondance.la source