글쎄, 이게 나를 미치게 만들고 있어! 로그 파일에서 일부 정보를 수집하여 이메일 알림의 요약에 추가하려고 합니다.
로그에서:
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
grep
Perl 호환 정규식(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
cut
3 이후의 모든 필드를 추출 하는 데 사용됩니다 .
grep -o 'created files:' $logfile | cut -d" " -f3-