Comment ajouter plusieurs recherches dans la commande AWK

10

Im essayant de rechercher les fichiers créés en juin, juillet et août. J'ai utilisé cette méthode

ls -lrth|awk '/[Jun][Jul][Aug]/ {print}'

mais ça ne marche pas.

OmiPenguin
la source
1
Pour mémoire, la [...]construction correspond à un seul caractère, qui peut être n'importe lequel des caractères entre les crochets. Ainsi, votre expression correspond à JJA ou Jug( Jde [Jun], ude [Jul]et gde [Aug]) mais pas aux abréviations de mois que vous espériez faire correspondre.
tripleee

Réponses:

12

Vous pouvez faire correspondre plusieurs modèles comme ceci:

awk '/Jun/ || /July/ || /Aug/' <(ls -lrh)

Cela renvoie toutes les correspondances pour juin, juillet ou août. Vous n'avez pas besoin de l' printinstruction car c'est l' awkaction par défaut de.

jasonwryan
la source
1
awk comprend les expressions rationnelles étendues, donc pour un modèle aussi simple que cela, vous pouvez l'écrire comme awk '/Jun|Jul|Aug/'ouawk '/Ju[nl]|Aug/'
cas
5

En règle générale, c'est une très mauvaise idée d' analyser la sortie de ls . Une meilleure façon de faire ce que vous voulez est

stat -c "%n %y" * | grep 2013-0[678]

Sinon, cochez uniquement le dernier champ pour vous protéger contre le cas peu probable où le nom de fichier lui-même est une date:

stat -c "%n %y" *| awk '$NF ~ /2013-0[678]/' 

De man stat:

   -c  --format=FORMAT
          use the specified FORMAT instead of the default; output  a  new
          line after each use of FORMAT

   %y     time of last modification, human-readable
   %n     file name
terdon
la source
C'est aussi un bon exemple. Je n'ai jamais vérifié STAT auparavant. merci pour la grande info
OmiPenguin
Peut-être changer en ... | awk '$NF ~ /2013-0[678]/'pour vérifier uniquement le dernier champ de sortie, dans le (peu probable?) Même si le nom d' un fichier correspond à l'expression régulière même lorsque la date ne le fait pas.
tripleee
3

lsest une commande pour afficher des informations sur les fichiers dans un format lisible par l'homme. Ne l'utilisez pas dans les scripts .

La commande pour rechercher des fichiers dans une arborescence de répertoires correspondant à certains critères est find. Si vous avez une recherche GNU (c.-à-d. Linux non intégré ou Cygwin) ou une recherche FreeBSD (c.-à-d. FreeBSD ou OSX), vous pouvez utiliser -newermtpour faire correspondre les fichiers qui ont été modifiés pour la dernière fois après une certaine date.

find . -newermt '1 June' ! -newermt '1 September' -print

Ajoutez une année si vous souhaitez faire correspondre les fichiers d'une année spécifique, plutôt que l'année civile lorsque le script s'exécute.

Si votre implémentation find n'a pas -newermt, vous devrez vous contenter de -newer, qui compare la date du fichier findtrouvé avec un fichier fixe. Utilisez touchpour créer des fichiers temporaires avec la date que vous souhaitez utiliser comme limite.

dir=$(mktemp -d)
touch -d 201306010000 "$dir/from"
touch -d 201309010000 "$dir/to"
find . -newer "$dir/from" ! -newer "$dir/to" -print
rm -r "$dir"
Gilles 'SO- arrête d'être méchant'
la source