정규식에서 단일 그룹만 추출

정규식에서 단일 그룹만 추출

함께 해킹된 일부 로그 파일에서 숫자 목록을 가져오기 위해 zgrep을 사용하려고 합니다. 그래서 저는 다음을 사용하고 있습니다:

zgrep -ie "total time: .* ms" *

이것은 내가 관심 있는 전체 행을 반환합니다. 나는 단지 번호를 원할 뿐이다. (총 시간 이후, "ms" 이전) 추가 처리 없이 이 정보를 얻을 수 있는 방법이 있습니까?

답변1

grep당신이 GNU grep이고 찾고 있는 숫자가 줄의 유일한 숫자라고 가정하는 경우 :

zgrep -ioEe '[0-9]+(\.[0-9]+)?' *

그렇지 않은 경우 언제든지 zgrep출력을 필터링할 수 있습니다.

zgrep -ie 'total time: .* ms' * | sed 's/.*total time: \(.*\) ms.*/\1/'

답변2

GNU grep을 사용하면 두 기능을 결합하여 원하는 것을 얻을 수 있습니다.

  • -o줄의 일치하는 부분만 인쇄하는 옵션입니다.
  • Perl 정규 표현식과 그너비가 0인 둘러보기 어설션게임 전후에 나타날 수 있는 내용을 제한합니다.
zgrep -Pi -o '(?<=total time: )([0-9.]+)(?= *ms)' *

또는 Perl을 호출할 수도 있습니다.

perl -MPerlIO::gzip -e 'for (@ARGV) {
    open IN, (/\.gz$/ ? "<:gzip" : "<"), $_ or die "$_: $!";
    $name = $_;
    while (<IN>) {
        if (/total time: ([0-9.]+) *ms/i) {print "$name:$1\n"}
    }
    close IN
}' *

이러한 도구가 없으면 파일을 수동으로 반복하고 호출하여 sed관심 있는 항목을 제외한 모든 항목을 제거할 수 있습니다.

for x in *; do
  case "$x" in
    *.gz) <"$x" gunzip;;
    *) cat "$x";;
  esac | sed -n -e 's/^.*total time: \([0-9.]*\) *ms.*$/\1/p'
done

관련 정보