Comment utiliser grep pour effectuer une recherche qui, lorsqu'une correspondance est trouvée, affiche le nom du fichier ainsi que les n premiers caractères de ce fichier? Notez que n
est un paramètre qui peut être spécifié et que les n premiers caractères contiennent effectivement la chaîne correspondante.Linux avec grep pour imprimer le nom du fichier et les n premiers caractères
Répondre
Vous devez rediriger la sortie de grep vers sed pour accomplir ce que vous voulez. Voici un exemple:
grep mypattern *.txt | sed 's/^\([^:]*:.......\).*/\1/'
Le nombre de points correspond au nombre de caractères que vous souhaitez imprimer. De nombreuses versions de sed fournissent souvent une option, comme -r (GNU/Linux) et -E (FreeBSD), qui vous permet d'utiliser des expressions régulières de style moderne. Cela permet de spécifier numériquement le nombre de caractères que vous souhaitez imprimer.
N=7
grep mypattern *.txt /dev/null | sed -r "s/^([^:]*:.{$N}).*/\1/"
Notez que cette solution est beaucoup plus efficace que d'autres, qui invoquent plusieurs processus.
Il y a peu d'outils qui impriment 'n caractères' plutôt que 'n lignes'. Êtes-vous sûr de vouloir vraiment des personnages et non des lignes? Le tout peut peut-être être mieux fait en Perl. Comme il est précisé (en utilisant grep
), nous pouvons faire:
pattern="$1"
shift
n="$2"
shift
grep -l "$pattern" "[email protected]" |
while read file
do
echo "$file:" $(dd if="$file" count=${n}c)
done
Les guillemets autour $file
conservent plusieurs espaces dans les noms de fichiers correctement. Nous pouvons débattre de l'utilisation de la ligne de commande, actuellement (en supposant que le nom de la commande est 'ngrep
'):
ngrep pattern n [file ...]
Je note que @litb utilisé' head -c $n
'; c'est plus propre que la commande dd
que j'ai utilisée. Il pourrait y avoir quelques systèmes sans head
(mais ils seraient assez archaïque). Je note que la version POSIX de head
prend uniquement en charge -n
et le nombre de lignes; l'option -c
est probablement une extension GNU.
grep -l pattern *.txt |
while read line; do
echo -n "$line: ";
head -c $n "$line";
echo;
done
changement -c
--n
si vous voulez voir les premières lignes n
au lieu d'octets.
Deux pensées ici:
1), vous pouvez vérifier l'état de $ [csh] après l'exécution grep sur chaque fichier Si l'efficacité n'a pas été une préoccupation (comme cela arrive jamais). Par exemple .: (Pour N caractères = 25.)
foreach FILE (file1 file2 ... fileN)
grep targetToMatch ${FILE} > /dev/null
if ($status == 0) then
echo -n "${FILE}: "
head -c25 ${FILE}
endif
end
2) GNU [FSF] tête contient un commutateur --verbose[-v]. Il offre également --null, pour accueillir les noms de fichiers avec des espaces. Et il ya '-', pour gérer les noms de fichiers comme "-c".Donc, vous pouvez faire:
grep --null -l targetToMatch -- file1 file2 ... fileN |
xargs --null head -v -c25 --
- 1. zcat à grep avec le nom de fichier
- 2. Qu'est-ce qu'une commande unix pour supprimer les N premiers caractères d'une ligne?
- 3. Ajuster les n premiers caractères alpha de la chaîne
- 4. Comment obtenir la commande find pour imprimer la taille du fichier avec le nom du fichier?
- 5. En bash, comment puis-je imprimer les n premiers éléments d'une liste?
- 6. SQL SELECT pour obtenir les N premiers entiers positifs
- 7. SSMS et affiche SQLCMD seulement les premiers 8000 caractères
- 8. Remplacer \ n avec \ r \ n dans le fichier Unix
- 9. T-SQL: Sélection des n premiers caractères d'une colonne text ou ntext
- 10. Comment extraire n caractères du tableau char
- 11. Comment obtenir les N premiers éléments d'une liste en C#?
- 12. Comment mettre à jour les n premiers enregistrements dans SQLite
- 13. Grep récursive et le comte
- 14. Comment supprimer les deux premiers et les deux derniers caractères d'une chaîne?
- 15. Lire le contenu du fichier et trouver le nom de fichier complet sur le disque
- 16. Ajouter un fichier à subversion avec des caractères spéciaux comme '%' dans le nom de fichier
- 17. Comment rechercher des fichiers contenant les fins de ligne dos (CRLF) avec grep sur Linux?
- 18. Définir les propriétés du chemin d'accès et du nom du fichier avant le téléchargement
- 19. Le nom du fichier DOS s'échappe pour être utilisé avec les commandes * nix
- 20. Comment faire pour SharePoint accepter les pièces jointes avec des caractères spéciaux dans le nom de fichier?
- 21. Comment tirer les 100 premiers caractères d'une chaîne en PHP
- 22. Fractionner un fichier et ses lignes sous Linux/bash
- 23. comment enlever les 3 premiers caractères de nsstring?
- 24. Premiers pas avec TDD et DDD
- 25. Premiers pas avec Shell Scripting?
- 26. Comment supprimer tous les n-ième caractères dans le fichier (par lot ou vbs)?
- 27. jQuery nom du fichier
- 28. Comment faire pour que le nom du fichier de sortie corresponde au nom du dossier
- 29. Comment gérer les relations n: n avec Rails?
- 30. Obtenir les n premières lignes correspondant à un certain modèle (avec les commandes Linux)
Sur ma machine linux, sed n'accepte pas de -E (grep le fait). Il fonctionne cependant avec -r –
Il cherche les N premiers caractères du fichier, pas N caractères correspondants. Ajoutez également/dev/null là-bas au cas où * .txt évalue à 0 ou 1 fichiers. Par exemple. grep mypattern * .txt/dev/null | sed ... –
Le motif RE étendu que j'ai donné ne correspondra pas aux lignes de moins de N caractères, et celles-ci seront donc correctement imprimées conformément à la spécification. Vous avez raison sur le besoin d'ajouter l'argument/dev/null. –