web-dev-qa-db-fra.com

Comment lire ligne par ligne dans un fichier en utilisant la boucle while, et à chaque itération, grep chaque ligne à comparer à une chaîne?

J'ai un fichier appelé abc.txt avec le contenu comme suit:

1: It is a Shell script
2: There are few lines in this file
3: I am good with programming in C, but beginner in Shell
4: We are going towards end of file
5: END OF FILE

Je veux lire chaque fichier de manière itérative et, à chaque itération, comparer la ligne "Je suis doué pour la programmation en C, mais débutant en Shell", puis effectuer certains traitements.

Toute aide serait grandement appréciée. Merci!

2
ShellyBelly

Essayez cet exemple de code pour vous aider à identifier et à modifier en fonction de vos besoins:

#!/usr/bin/env bash
set -e
set -x 

while read -r linenum line
do
        if [ "$line" = "I am good with programming in C, but beginner in Shell" ]
        then
                # Process things here
                echo "same"
        fi
done < "$1"

Usage:

  • Rendre exécutable:

    chmod +x script.sh
    
  • Placez le script dans n’importe quel dossier, puis exécutez le script en lui passant un fichier:

    ./script.sh /path/to/data.txt
    

Info:

  • -r: L'option passée à la commande read empêche l'interprétation des échappements de barre oblique inverse.
  • set -e: Option Bash pour arrêter le script à la première erreur.
  • set -x: Option Bash utilisée pour déboguer le scrtip.
  • "$1": la variable de fichier transmise au script dans ce cas data.txt
  • linenum: variable qui contient les numéros de ligne lorsque bash divise les lignes lues en deux variables, tandis que l’autre est transmise via la variable lin.
7
George Udosen

L'utilisation d'une boucle Shell n'est pas nécessaire, car grep itère déjà sur des lignes:

grep '^[0-9]:  I am good with programming in C, but beginner in Shell' input.txt

S'il y a une ligne correspondante, elle sera imprimée. [0-9] définit la plage de caractères à rechercher. Nous pouvons également étendre cela à des nombres plus longs [0-9]*: (et je pense qu'avec l'option Perl regex -P, on pourrait le faire sous la forme [0-9]+:).

Si une boucle Shell est vraiment nécessaire, nous pouvons utiliser l'instruction case pour la recherche de modèle

while IFS= read -r line; do
    case $line in
        *": I am good with programming in C") echo "Matched: $line";;
    esac
done < input.xt
7