Unix, найди, ls, grep и сортируй - PullRequest
1 голос
/ 23 января 2011

С помощью этой команды Unix я пытаюсь найти текст в каталоге

find . -type f -iname *index*jsp -print | xargs ls -t | xargs grep body

./apache-tomcat-6.0.18/a/index.jsp:<body>
./apache-tomcat-6.0.18/b/index.jsp: <body>

Но этот результат не идеален, я хочу получить дату создания файла и номер строки совпадающей строки, например

./apache-tomcat-6.0.18/a/index.jsp: 2011-1-2 Line 3
./apache-tomcat-6.0.18/b/index.jsp: 2011-1-1 Line 4

Как мне этого добиться?

Ответы [ 4 ]

4 голосов
/ 23 января 2011

То, что вы можете сделать, чтобы получить нужный формат, выглядит примерно так (в bash / Linux, не тестировалось):

find . -type f -iname \*index\*jsp -print |
while read f; do
  if grep -q body "$f"; then
    modified_time=`stat -f %c "$f"`
    match_line=`awk '/body/ {print NR; exit}' "$f"`
    echo "$f $modified_time Line $match_line"
  fi
done
1 голос
/ 23 января 2011

Во-первых, в UNIX не записана дата создания файла.Для номеров строк это будет соответствовать:

find . -type f -iname '*index*jsp' -exec grep -n body '{}' ';'
0 голосов
/ 03 мая 2012

1) Вы должны замаскировать * index * jsp.В противном случае оболочка разрешит его, и если у вас получится файл a-index-0.jsp, поиск будет сопоставлен с этой заменой.,

 find . -type f -iname "*index*jsp" | xargs ls -t | xargs grep body

3) find имеет возможность вызывать внешние программы с помощью -exec;не нужно звонить xargs по трубе.

 find . -type f -iname "*index*jsp" -exec ls -t {} ";" -exec grep -n body {} ";"

4) Форматирование вывода find может быть выполнено самим find - cTime, mTime и breakfeasttime.;) Посмотрите на себя (man find), чтобы найти множество опций -printf, особенно для времен.

 find tmp -type f -iname "*index*jsp" -printf "%H/%f\t %CD\t" -exec grep -n body {} ";"

5) Почему?

Если в вашей находке, как и в GNU-find, есть эти опции, вам не нужно очищать от пробелов в именах файлов.Пробелы в именах файлов трудно обрабатывать - find -print0 | xargs ... может это сделать, но вам не нужно это делать, если вы остаетесь в поиске.Но если вы вызовете «ls», вы потерялись.

Возможно, ваша текущая команда не выдаст файл с пробелами / символами новой строки / табуляцией в имени.Хорошо.Но изучение лучшего пути и постоянное общение с ним предотвращают ошибки позже и для других.

0 голосов
/ 23 января 2011
find . -name index* | xargs ls -t | xargs grep -Z body \
    | tr -s " " \
    | cut -d $'\0' -f 1 | uniq \
    | xargs -n 1 -I {} -exec sh -c \ "
        echo -n {} \" \"; \
        ls -lt {} | tr -s \" \" | cut -d \" \" -f 6; \
        grep -n body {} | cut -d ":" -f 1
    "

Это как можно ближе к этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...