내 파일에는 다음과 같은 수십 개의 값이 있습니다.
(1608926678.237962) vcan0 123#0000000158
(1608926678.251533) vcan0 456#0000000186
해시 기호 앞의 숫자를 기준으로 각 숫자의 수량을 계산하고 싶습니다(포함할 수도 있음)
팔로우를 시도했지만 항상 0이 나왔습니다.
grep -o '\b\d+#\b' ./file.log | wc -l
어떤 아이디어가 있나요? 위의 예에서 내가 원하는 것은 다음과 같습니다.
123# 1
456# 1
답변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
답변2
이것은 정확히 설명하는 출력은 아니지만 이것이 실제로 어려운 요구 사항인 경우 해당 형식에 맞게 조정할 수 있습니다.
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}'
답변3
GNU 사용 awk
:
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
awk '{for(i=1;i<=NF;i++){if($i ~ /#/){print $i}}}' filename| awk -F "#" '{print $1"#",gsub($1,$0)}'
산출
123# 1
456# 1