Я хочу извлечь фрагмент Jul 22
от вывода:
-rw-rw-r-- 1 douglas douglas 92188 Jul 22 08:47 master-terfron-21-07.log
Это - вывод команды:
ls -l *.log
Как я использовал бы регулярное выражение для получения необходимой части?
Поскольку Вы хотите только время последнего изменения (месяц и дата) эти .log
файлы в текущем каталоге, можно просто использовать -r
опция date
. Нет никакой потребности ни в каком regex или других лишних командах.
можно использовать эту остроту оболочки:
for i in *.log; do echo "$i: $(date '+%b-%d' -r "$i")"; done
, Например, я нахожу месяц и дату последнего изменения всего .txt
файлы в текущем каталоге:
$ for i in *.txt; do echo "$i: $(date '+%b-%d' -r "$i")"; done
file.txt: Feb-12
new.txt: Jul-23
основная команда, включенная здесь:
date '+%b-%d' -r file.txt
$ date '+%b-%d' -r file.txt
Feb-12
, Если Вы хотите сделать операцию рекурсивно, используйте find
:
find . -type f -name '*.txt' -printf '%p: ' -exec date '+%b-%d' -r {} \;
Пример:
$ find . -type f -name '*.txt' -printf '%p: ' -exec date '+%b-%d' -r {} \;
./foo/list.txt: Jul-16
./new.txt: Jul-15
./file.txt: Jul-23
РЕДАКТИРОВАНИЕ:
Ради ответа на оригинал regex
путь:
$ ls -l *.txt | grep -Po '.*[[:digit:]]+ \K[[:alpha:]]{3} [[:digit:]]{2}'
Jul 23
Jul 15
grep -Po
указывает, что мы будем использовать PCRE и только брать подобранную часть
.*[[:digit:]]+
соответствия до нашей желаемой части и \K
отбрасывания соответствие
[[:alpha:]]{3} [[:digit:]]{2}
соответствия три буквенных символа (месяц), сопровождаемый пространством и двумя цифрами (дата).
Для получения даты последнего изменения файла, можно использовать:
$ stat -c '%n: %y' *.log
alternatives.log: 2015-07-20 09:28:52.727063510 +0200
apport.log: 2015-07-23 09:32:58.282590564 +0200
Посмотрите stat
страница справочника для дальнейших опций.
Простое решение для использования ls
с cut
:
ls -l filename | cut -f 6,7 -d' '
пример:
$ touch file
$ ls -l file | cut -f 6,7 -d' '
Jul 23
Другое решение:
ls -l filename |awk {'print $9" was last modified "$6" "$7'}