kent, grep --versionest-ce la commande à utiliser pour connaître la version grep? Si c'est le cas, cela ne fonctionne pas. Impossible de trouver une autre commande pour connaître la version grep.
Vivek
2
bonne question mais «Os version» est un exemple de nom de fichier déroutant
HaveAGuess
1
L'OS et la version ne sont pas pertinents ici.
MD XF
grep 'pattern' *
user0
Réponses:
431
Essayez cette petite astuce pour vous grepfaire croire qu'elle traite plusieurs fichiers, afin qu'elle affiche le nom de fichier:
Oui, ça a marché. Pouvez-vous me dire quelle est la signification de l'ajout /dev/nullde cette commande?
Vivek
55
S'il grepest fourni avec plusieurs noms de fichier, il affichera automatiquement les noms de fichier avant la correspondance, mais il laissera le nom de fichier en cas de fichier d'entrée unique. En utilisant /dev/nullcomme fichier d'entrée supplémentaire grep"pense" qu'il traite de plusieurs fichiers, mais / dev / null est bien sûr vide, donc il n'apparaîtra pas dans la liste des correspondances ..
Scrutinizer
32
utiliser / dev / null est une astuce intelligente, mais je pense que la suggestion ci-dessous du drapeau -H est une meilleure réponse.
JohnQ
22
OK, mais l' -Hoption pour grep ne fait pas partie de POSIX, et le système d'exploitation utilisé est Solaris 10, où ni le grep standard, ni la version conforme à POSIX de grep n'ont l' -Hoption.
Scrutinizer
4
C'est important si vous utilisez grep avec find, comme find . -name foo -exec grep pattern {} \;- en supposant que beaucoup de fichiers sont nommés foodans votre sous-répertoire, findremet toujours grepun seul fichier pour fonctionner à la fois. L' /dev/nullastuce semble fonctionner dans toutes les saveurs linux / osx que j'ai essayées, alors bravo! Notez que je pense que -Hc'est plus propre, mais comme mentionné ci-dessous, il pourrait ne pas être pris en charge avec votre version de grep.
Jon V
297
Si vous avez les options -Het -ndisponibles ( man grepest votre ami):
@codeforester Je ne connais aucun autre greps, donc je ne sais pas.
MD XF
2
Cool ! cela a fonctionné pour linux. si vous utilisez mac, pouvez installer coreutils avec brew. Et n'oubliez pas d'ajouter PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH" à la vôtre .bashrc
zw963
2
Cela (aussi) a fonctionné dans MinGW (1.0.17, je pense).
Peter Mortensen
Cela fonctionne pour moi avec le grep Mac intégré (2.5.1-FreeBSD). Mais pour utiliser l'alternative grep de Homebrew, une autre façon est d'exécuter brew install greppuis d'utiliser ggrep. Pas besoin de modifier PATH.
wonderlr
5
Que diriez-vous de cela, que j'ai réussi à atteindre grâce, en partie, à ce poste.
Vous voulez trouver plusieurs fichiers, disons des journaux avec des noms différents mais un modèle (par exemple filename=logfile.DATE), à l'intérieur de plusieurs répertoires avec un modèle (par exemple /logsapp1, /logsapp2). Chaque fichier a un modèle que vous voulez grep (par exemple "init time"), et vous voulez avoir le "init time"fichier de chaque fichier, mais en sachant à quel fichier il appartient.
Ou tout simplement en utilisant findfind ./path_pattern/to_files -type f -name "files*.log" -exec grep -Hn pattern {} \;
Martin
1
Il s'agit d'une légère modification par rapport à une solution précédente. Mon exemple recherche la redirection stderr dans les scripts bash:
grep '2>' $(find . -name "*.bash")
grep --version
grep --version
est-ce la commande à utiliser pour connaître la version grep? Si c'est le cas, cela ne fonctionne pas. Impossible de trouver une autre commande pour connaître la version grep.grep 'pattern' *
Réponses:
Essayez cette petite astuce pour vous
grep
faire croire qu'elle traite plusieurs fichiers, afin qu'elle affiche le nom de fichier:Pour obtenir également le numéro de ligne:
la source
/dev/null
de cette commande?grep
est fourni avec plusieurs noms de fichier, il affichera automatiquement les noms de fichier avant la correspondance, mais il laissera le nom de fichier en cas de fichier d'entrée unique. En utilisant/dev/null
comme fichier d'entrée supplémentairegrep
"pense" qu'il traite de plusieurs fichiers, mais / dev / null est bien sûr vide, donc il n'apparaîtra pas dans la liste des correspondances ..-H
option pour grep ne fait pas partie de POSIX, et le système d'exploitation utilisé est Solaris 10, où ni le grep standard, ni la version conforme à POSIX de grep n'ont l'-H
option.find . -name foo -exec grep pattern {} \;
- en supposant que beaucoup de fichiers sont nommésfoo
dans votre sous-répertoire,find
remet toujoursgrep
un seul fichier pour fonctionner à la fois. L'/dev/null
astuce semble fonctionner dans toutes les saveurs linux / osx que j'ai essayées, alors bravo! Notez que je pense que-H
c'est plus propre, mais comme mentionné ci-dessous, il pourrait ne pas être pris en charge avec votre version degrep
.Si vous avez les options
-H
et-n
disponibles (man grep
est votre ami):Options:
-H
est une extension GNU, mais-n
est spécifiée par POSIXla source
-H
n'est pas pris en charge ici.Aucune astuce nécessaire.
Avec des numéros de ligne:
la source
grep
s, donc je ne sais pas.brew install grep
puis d'utiliserggrep
. Pas besoin de modifier PATH.Que diriez-vous de cela, que j'ai réussi à atteindre grâce, en partie, à ce poste.
Vous voulez trouver plusieurs fichiers, disons des journaux avec des noms différents mais un modèle (par exemple
filename=logfile.DATE
), à l'intérieur de plusieurs répertoires avec un modèle (par exemple/logsapp1, /logsapp2
). Chaque fichier a un modèle que vous voulez grep (par exemple"init time"
), et vous voulez avoir le"init time"
fichier de chaque fichier, mais en sachant à quel fichier il appartient.Alors ce
outputfilename.txt
serait quelque chose commeEn général
Explication:
find
La commande recherchera les noms de fichiers en fonction du modèlepuis, le tube
xargs -I{}
redirigera lafind
sortie vers le{}
qui sera l'entrée pour
grep ""pattern" {}
Ensuite, l'astuce pour faire
grep
afficher les noms de fichiers\dev\null
et enfin, écrivez la sortie dans un fichier avec
tee outputfile.txt
Cela a fonctionné pour moi dans la
grep
version 9.0.5 build 1989.la source
find ./path_pattern/to_files -type f -name "files*.log" -exec grep -Hn pattern {} \;
Il s'agit d'une légère modification par rapport à une solution précédente. Mon exemple recherche la redirection stderr dans les scripts bash:
grep '2>' $(find . -name "*.bash")
la source
travaillé pour moi pour rechercher dans tous les fichiers .txt (entrez votre propre valeur de recherche, bien sûr).
la source