группировка и подсчет по регулярному выражению

timeout -t 10 command
if [ $? -eq 143 ]; then
    exit 0
else
    exit 1
fi
4
21.12.2020, 22:05
5 ответов

Это не совсем тот вывод, который вы описали, но если это действительно сложное требование, его можно преобразовать в этот формат, но:

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}'
4
18.03.2021, 22:41

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
4
18.03.2021, 22:41

С 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
4
18.03.2021, 22:41

С любым awk в любой оболочке на каждой машине Unix:

$ awk -F'[ #]' '{cnt[$3]++} END{for (val in cnt) print val"#", cnt[val]}' file
123# 1
456# 1
2
18.03.2021, 22:41
awk '{for(i=1;i<=NF;i++){if($i ~ /#/){print $i}}}' filename| awk -F "#" '{print $1"#",gsub($1,$0)}'

выход

123# 1
456# 1
0
18.03.2021, 22:41

Теги

Похожие вопросы