함께 해킹된 일부 로그 파일에서 숫자 목록을 가져오기 위해 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