timeout -t 10 command
if [ $? -eq 143 ]; then
exit 0
else
exit 1
fi
Это не совсем тот вывод, который вы описали, но если это действительно сложное требование, его можно преобразовать в этот формат, но:
awk -F'[ #]' '{print $3}' input | sort -n | uniq -c
Команда awk извлечет ваш номер до #
, а затем передаст его в sort
/ uniq
. uniq -c
предоставит количество каждого значения.
Чтобы получить выходной формат:
awk -F'[ #]' '{print $3}' input | sort -n | uniq -c | awk '{print $2"#",$1}'
grep + Баш:
$ grep -Eo '\b[0-9]+#\b'./file.log | sort | uniq -c | while read -r a b; do echo "$b" "$a"; done
123# 1
456# 1
С GNUawk
:
awk -v FPAT=' [0-9]+#' '{ c[$1]++; }; END{ for(x in c) print x, c[x]; }' infile
123# 1
456# 1
Предполагая, что всегда есть один шаблон " [0-9]+#
", соответствующий каждой строке, как показано в вашем заданном образце ввода;
для фильтрации пробелов в результате, а также во время обработки ввода, подобного:
(1608926678.237962) vcan0 123#0000000158
(1608926678.251533) vcan0 456#0000000186
(1608926678.237962) vcan0 123#0000000158
(1608926678.251533) vcan0 456#0000000186
(1608926678.237962) vcan0 123#0000000158
(1608926678.251533) vcan0 456#0000000186
(1608926678.237962) vcan0 123#0000000158
awk -v FPAT='[ \t][0-9]+#' '{
filter=$1; sub(/[ \t]/, "", filter);
c[filter]++;
};
END{ for(x in c) print x, c[x]; }' infile
456# 3
123# 4
для ввода, имеющего несколько совпадающих шаблонов " [0-9]+#
" в каждой или каждой строке, вы должны сделать:
awk -v FPAT='[ \t][0-9]+#' '{
for (i=1; i<=NF; i++){
filter=$i; sub(/[ \t]/, "", filter); c[filter]++;
};
};
END{ for(x in c) print x, c[x]; }' infile
С любым awk в любой оболочке на каждой машине Unix:
$ awk -F'[ #]' '{cnt[$3]++} END{for (val in cnt) print val"#", cnt[val]}' file
123# 1
456# 1
awk '{for(i=1;i<=NF;i++){if($i ~ /#/){print $i}}}' filename| awk -F "#" '{print $1"#",gsub($1,$0)}'
выход
123# 1
456# 1