En ksh93
, bash
ozsh
:
files=( 2*.txt )
cat "${files[@]: -5}"
Esto crearía una matriz de nombres de archivo que coinciden con el patrón 2*.txt
. Luego generaría el contenido de los últimos cinco de estos.
En zsh
, también puede especificar un rango de archivos como parte de sus calificadores globales:
cat 2*.txt([-5,-1])
En cualquier shell POSIX, esto también se puede hacer a través de
set -- 2*.txt
while [ "$#" -gt 5 ]; do shift; done # or: [ "$#" -gt 5 ] && shift "$(( $# - 5 ))"
cat "$@"
Esto establece los parámetros posicionales para los nombres de archivo que coinciden con el patrón. Luego cambia los nombres desde el principio de la lista hasta que la lista solo tenga cinco elementos. Luego se invoca cat
en los nombres de archivo restantes.
En todas estas soluciones, los archivos se ordenarían lexicográficamente. Los nombres de archivo con espacios o saltos de línea se manejan correctamente.
Предполагая, что ваш файл называется logFile
, эта команда сделает это:
egrep ',logDurationMillis:(9[5-9][0-9]|[1-9][0-9]{3,}),' logFile
еще один awk
один:
awk -F':|,' '$4 > 950' file
отпечатки:
logAlias:Overall,logDurationMillis:961,logTimeStart:2019-07-24_15:30:06.599,logTimeStop:2019-07-24_15:30:06.660
Обновление(в связи с вопросом ОП:)
вы можете реконструировать поля следующим образом:
awk -F':|,' '$4 > 950 {print $3 ":" $4 "," $5 ":" $6 ":" $7 ":" $8 }' file
отпечатки:
logDurationMillis:961,logTimeStart:2019-07-24_15:30:06.599
(возможно, существует более простой способ объединения полей 3 -8, но вам также необходимо восстановить различные разделители полей)
С awk:
если вы знаете, что "logDurationMillis" является вторым элементом:
awk -F'[:,]' -v limit=950 '$4 >= limit' file
иначе
awk -F'[:,]' -v limit=950 '{
for (i=1; i<NF; i+=2)
if ($i == "logDurationMillis" && $(i+1) >= limit)
print
}' file