일치 후 나머지 줄을 인쇄하려면 grep을 사용하십시오.

일치 후 나머지 줄을 인쇄하려면 grep을 사용하십시오.

글쎄, 이게 나를 미치게 만들고 있어! 로그 파일에서 일부 정보를 수집하여 이메일 알림의 요약에 추가하려고 합니다.

로그에서:

2019/07/22 11:36:03 [14396] 생성된 파일 수: 3 (reg: 2, dir: 1)

이제 마지막 부분인 3, 2, 1 또는 전체 마지막 부분 3(reg: 2, dir: 1)의 숫자만 인쇄하고 싶습니다.

나는 다른 방법을 시도했고 이것이 내가 얻은 가장 가까운 방법이지만 숫자 3만 인쇄하고 내가 원하는 나머지 정보는 인쇄하지 않습니다.

nf=$(grep -o 'created files:' $logfile) | cut -d\   -f3)

이것이 가능한가?

편집하다:

알았어 그래서 난 이걸 일하는데 사용하고 있어nf=$(grep -Po 'created files: \K.*' "$logfile")

요약하자면 다음과 같은 출력을 얻기 위해 $nf를 추가하면 Created $nf new files다음과 같은 결과가 나옵니다.

3개(reg: 2, dir: 1) 새 파일이 생성되었습니다.

이제 어떻게든 이것을 더 분할하여 결과가 다음과 같도록 할 수 있습니까? 1개의 디렉터리와 2개의 파일이 생성되었습니다.

어쩌면 두 개의 개별 grep 명령을 사용하여 다른 변수를 출력할 수 있을까요? 하나는 dir용이고 다른 하나는 reg용입니다.

답변1

grepPerl 호환 정규식(PCRE)을 지원하는 경우 :

$ grep -Po 'created files: \K.*' "$logfile"
3 (reg: 2, dir: 1)

숫자를 배열에 저장하려면 다음을 수행하십시오 bash.

$ numbers=( $(grep -o 'created files:.*' "$logfile" | grep -o '[0-9]\+') )
$ echo ${numbers[@]}
3 2 1
$ echo "${numbers[0]}, ${numbers[1]}, ${numbers[2]}"
3, 2, 1

답변2

Perl이 구조에 옵니다:

$ perl -ne 'print "$1 $2 $3\n" if /created files: (\d+) \(reg: (\d+), dir: (\d+)\)/' < "$logfile"
3 2 1

또는 다음과 같이 sed:

$ sed -nEe 's/.*created files: ([0-9]+) \(reg: ([0-9]+), dir: ([0-9]+)\)/\1 \2 \3/p' "$logfile"
3 2 1

둘 다 기본적으로 동일한 작업을 수행합니다. 줄의 전체 끝 부분(단지 )을 일치시키지만 숫자를 created files캡처(사용 )하여 인쇄하거나 줄을 해당 줄로 바꿉니다.(...)

답변3

명령을 수정하려면 다음을 수행하세요.

  • 출력에 줄의 나머지 부분을 포함 .*하려면 패턴에 추가하세요 .grep
  • -f3-세 번째부터 마지막까지 모든 필드를 선택하는 데 사용됩니다 .

-->

grep -o 'created files: .*' "$logfile" | cut -d\  -f3-

답변4

cut3 이후의 모든 필드를 추출 하는 데 사용됩니다 .

grep -o 'created files:' $logfile | cut -d" " -f3-

관련 정보