3 votes

Comment trouver les logs qui contiennent une certaine chaîne de caractères dans un grand nombre de fichiers gz/réguliers et les enregistrer dans un ou plusieurs fichiers txt ?

Nouvelle question le 22.9.2016, ci-dessous !

Mon parcours se présente comme suit :

~/Desktop/logs
 first_folder
|    11.11 (folder)
   |    access_log
   |    access_log.1.gz
   |   :
   |    access_log.40.gz
|    11.12 (folder)
        access_log
        access_log.1.gz
       :
        access_log.16.gz
 second_folder (folder)
|    31.11 (folder)
   |    access_log
   |    access_log.1.gz
   |   :
   |    access_log.20.gz
|    31.15 (folder)
        access_log
        access_log.1.gz
       :
:        access_log.38.gz
 last_folder
     91.11 (folder)
    |    access_log
    |    access_log.1.gz
    |   :
    |    access_log.25.gz
     91.15 (folder)
         access_log
         access_log.1.gz
        :
         access_log.30.gz

Je dois extraire de tous les journaux les données qui contiennent des chaînes de caractères : /Jan/2016

Question n° 1

Comment puis-je obtenir tous les enregistrements de tous les fichiers de tous les dossiers et les sauvegarder en tant que single_file.txt

Édition n° 1

Réponse possible :

$ find . -name \*.* | xargs -0 zgrep -E '/Jan/2016' > single_file.txt

Le fichier est vraiment très volumineux, beaucoup de Go.

Sortie :

single_file.txt
./first_folder/11.11/access_log.9.gz: ... text ...
./first_folder/11.12/access_log.9.gz: ... text ...
./second_folder/31.11/access_log.9.gz: ... text ...
./second_folder/31.11/access_log.9.gz: ... text ...
:

Question n° 2

Comment puis-je récupérer tous les enregistrements de tous les fichiers de tous les dossiers et les enregistrer individuellement en fonction des enregistrements que je récupère dans le premier dossier, le deuxième dossier, etc. first.txt, second.txt .

Le résultat ressemblerait à quelque chose comme :

first.txt
./first_folder/11.11/access_log.9.gz: ... text ...
./first_folder/11.12/access_log.9.gz: ... text ...
:
second.txt
./second_folder/31.11/access_log.9.gz: ... text ...
./second_folder/31.15/access_log.9.gz: ... text ...
:

Question n° 3

Comment puis-je obtenir la liste de tous les fichiers qui contiennent une chaîne de caractères ? /Jan/2016 ?

Si j'utilise cette commande, tous les fichiers seront-ils récupérés ?

$ find ~/Desktop/logs/ -type f | xargs zgrep -l "/Jan/2016"  

Sortie :

Terminal
/home/name/Desktop/logs/first_folder/11.11/access_log.9.gz
/home/name/Desktop/logs/first_folder/11.12/access_log.8.gz
/home/name/Desktop/logs/second_folder/31.11/access_log.6.gz
:

Editer #2

Code de @waltinator et correction de @Zanna :

pushd ~/Desktop/logs
for dir in * ; do
    if [[ -d "$dir" ]] ; then
        outname="$dir.txt"
        find "$dir" -type f -print0 | xargs -0 zgrep -l '/Jan/2016' >"$outname"
    fi
done
popd

me donnera une structure :

~/Desktop/logs
 first_folder
|    first.txt
 second_folder
|    second.txt
:
 last_folder
     last.txt

first.txt-last.txt contiendra les chemins d'accès à des fichiers spécifiques contenant la chaîne /Jan/2016.

first.txt
first_folder/11.11/access_log.9.gz
first_folder/11.11/access_log.8.gz
first_folder/11.12/access_log.9.gz
first_folder/11.12/access_log.8.gz

Question n°4 (22.9.2016)

J'ai dû modifier /Jan/2016 à une certaine période de temps...par exemple 1/Nov/2014-31/Apr/2015 donc dans un code fourni par @Zana à la place de la fonction /Jan/2016 J'ai utilisé /(Nov|Dec)/2014|/(Jan|Feb|Mar|Apr)/2015 . Un avertissement est lancé :

xargs: Warning: a NUL character occurred in the input.  It cannot be passed through in the argument list.  Did you mean to use the --null option?

Tous les résultats ne sont pas renvoyés dans les fichiers créés, bien que tous les fichiers soient créés.

4voto

waltinator Points 32821

La façon moderne d'utiliser find , en gardant à l'esprit que vous verrez éventuellement un nom de fichier contenant des espaces, est avec -print0 y xargs -0 :

# list all filenames containing '/Jan/2016'
find ~/Desktop/logs -type f -print0 | xargs -0 zgrep -l '/Jan/2016'
# 1. Have all the data from all folders that contain that string under one text file
find ~/Desktop/logs -type f -print0 | xargs -0 zgrep -l '/Jan/2016' >one.text.file
#
# 2. Have data that contains string in a separate text files depending on a folder (example: first folder - first.txt etc)
pushd ~/Desktop/logs
for dir in * ; do
    if [[ -d "$dir" ]] ; then
        outname="$dir.txt"
        find "~/Desktop/logs/$dir" -type f -print0 | xargs -0 zgrep -l '/Jan/2016' >"$outname"
    fi
done
popd

3voto

Zanna Points 65764
  1. Les données contenant des chaînes de caractères sont stockées dans des fichiers texte distincts en fonction du dossier (exemple : premier dossier - first.txt, etc.).

Vous pouvez utiliser une boucle très simple pour créer un fichier texte contenant les enregistrements de ce répertoire à l'intérieur du répertoire :

for d in ~/Desktop/logs/* ; do zgrep -E '/Jan/2016' "$d"/* >"$d"/out.txt ; done

Desktop/logs
 first_folder
    access_log
    access_log.gz
    out.txt
 second_folder
     access_log
     access_log.gz
     out.txt

En utilisant ce léger ajustement pour Le script de waltinator :

for d in ~/Desktop/logs/* ; do
    if [[ -d "$d" ]] ; then
        outname="$d".txt
        find "$d" -type f -print0 | xargs -0 zgrep -E '/Jan/2016' >"$outname"
    fi
done

donnera cette structure :

 first_folder
    access_log
    access_log.gz
 first_folder.txt
 second_folder
    access_log
    access_log.gz
 second_folder.txt

Notes

  • for d in ~/Desktop/logs/* ; do boucle sur le contenu de la base de données ~/Desktop/logs et en faire quelque chose
  • if [[ -d "$d" ]]; then ne faire quelque chose que si $d est un répertoire
  • find "$d" -type f -print0 recherche dans les annuaires $d pour les fichiers et les sortir avec le séparateur null afin que nous puissions utiliser la fonction
  • xargs -0 construit une commande avec la sortie de la commande précédente comme arguments, en utilisant le caractère nul comme séparateur (sinon les noms de fichiers avec des espaces ne permettent pas cette approche)
  • zgrep recherches dans les archives zippées/compressées

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X