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
où 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.