따라서 파일을 열어서 일치하는 줄을 얻는 데 cat
사용 grep
하면 처리 할 특정 로그 세트로 작업 할 때만 가능합니다. 라인을 패턴과 일치시키는 방법이 필요하지만, 일치 후 라인의 일부만 반환합니다. 경기 전후의 부분은 지속적으로 다릅니다. 내가 사용하여 연주 한 sed
나 awk
,하지만 경기 전 부분을 삭제하거나 경기 후 일부를 반환하거나 라인을 필터링하는 방법을 알아낼 수 없었던 어느 작동합니다. 이것은 필터링 해야하는 라인의 예입니다.
2011-11-07T05:37:43-08:00 <0.4> isi-udb5-ash4-1(id1) /boot/kernel.amd64/kernel: [gmp_info.c:1758](pid 40370="kt: gmp-drive-updat")(tid=100872) new group: <15,1773>: { 1:0-25,27-34,37-38, 2:0-33,35-36, 3:0-35, 4:0-9,11-14,16-32,34-38, 5:0-35, 6:0-15,17-36, 7:0-16,18-36, 8:0-14,16-32,34-36, 9:0-10,12-36, 10-11:0-35, 12:0-5,7-30,32-35, 13-19:0-35, 20:0,2-35, down: 8:15, soft_failed: 1:27, 8:15, stalled: 12:6,31, 20:1 }
내가 필요한 부분은 “스톨”된 후의 모든 것입니다.
이것의 배경은 무언가가 얼마나 자주 멈추는 지 알 수 있다는 것입니다.
cat messages | grep stalled | wc -l
내가해야 할 일은 특정 노드가 몇 번이나 멈추었는지 알아내는 것입니다 ( “중지”후 각 콜론 앞 부분으로 표시됩니다.) 그냥 grep하면 (예 : 20 🙂 소프트 실패한 줄을 반환 할 수 있지만 스톨이 없어서 도움이되지 않습니다. 스톨 된 부분 만 필터링하면 스톨 된 노드에서 특정 노드를 잡을 수 있습니다.
모든 의도와 목적을 위해, 이것은 표준 GNU 코어 유틸리티를 갖춘 freebsd 시스템이지만 도움을 줄 수있는 추가 장비는 설치할 수 없습니다.
답변
이를위한 표준 도구는 다음과 같습니다 sed
.
sed -n -e 's/^.*stalled: //p'
상해:
-n
기본적으로 아무 것도 인쇄하지 않음을 의미합니다.-e
뒤에 sed 명령이옵니다.s
패턴 교체 명령입니다.- 정규 표현식
^.*stalled:
은 찾고자하는 패턴과 이전 텍스트 (.*
모든 텍스트를 의미^
하며 처음부터 일치가 줄의 시작 부분에서 시작된다는 의미)와 일치합니다. 경우 참고stalled:
라인에 여러 번 발생, 이번이 마지막 발생을 일치합니다. - 일치하는 항목, 즉 줄의 모든 항목
stalled:
은 빈 문자열 (예 : 삭제)로 바뀝니다. - 마지막
p
은 변환 된 선을 인쇄하는 것을 의미합니다.
일치하는 부분을 유지하려면 역 참조를 사용 \1
하십시오. 교체 부분 \(…\)
에서 패턴 의 그룹 내부에있는 것을 지정 합니다. 여기서 stalled:
교체 부분에 다시 쓸 수 있습니다 . 이 기능은 찾고있는 패턴이 단순한 문자열보다 더 일반적인 경우에 유용합니다.
sed -n -e 's/^.*\(stalled: \)/\1/p'
때로는 경기 후 줄의 일부를 제거하고 싶을 수도 있습니다. .*$
패턴의 끝에 (텍스트 .*
뒤에 줄의 끝)를 포함시켜 매치에 포함시킬 수 있습니다 $
. 대체 텍스트에서 참조하는 그룹에 해당 부분을 넣지 않으면 행의 끝이 출력에 포함되지 않습니다.
그룹 및 역 참조에 대한 추가 설명으로이 명령은 일치 전 부분과 일치 후 부분을 교환합니다.
sed -n -e 's/^\(.*\)\(stalled: \)\(.*\)$/\3\2\1/p'
답변
이미 사용중인 다른 표준 도구 : grep
:
예를 들면 다음과 같습니다.
grep -o 'stalled.*'
Gilles의 두 번째 옵션과 동일한 결과가 있습니다.
sed -n -e 's/^.*\(stalled: \)/\1/p'
-o
플래그는 반환 --only-matching
물론 – – 일반적으로 그렙에 의해 수행 표현식의 일부로, 그렇지 않다 전체 라인을.
출력에서 “stalled :”를 제거하기 위해 세 번째 표준 도구 인 cut을 사용할 수 있습니다.
grep -o 'stalled.*' | cut -f2- -d:
이 cut
명령은 분리 문자를 사용 :
하고 끝까지 필드 2를 인쇄합니다. 물론 환경 설정의 문제이지만 cut
기억하기 쉬운 구문입니다.
답변
나는 ifconfig | grep eth0 | cut -f3- -d:
이것을 가지고
[root@MyPC ~]# ifconfig
eth0 Link encap:Ethernet HWaddr AC:B4:CA:DD:E6:F8
inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:78998810244 errors:1 dropped:0 overruns:0 frame:1
TX packets:20113430261 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:110947036025418 (100.9 TiB) TX bytes:15010653222322 (13.6 TiB)
그리고 이렇게 보이게
[root@MyPC ~]# ifconfig | grep eth0 | cut -f3- -d:
C4:7A:4D:F6:B8
답변
고려한 다른 표준 도구 awk
는 다음 줄과 함께 사용할 수 있습니다.
awk -F"stalled" '/stalled/{print $2}' messages
상해:
-F
줄에 대한 구분 기호를 정의합니다 (예 : “중지됨”). 구분 기호 앞의 모든 내용$1
과로 끝나는 모든 항목을 다룹니다$2
./reg-ex/
일치하는 정규 표현식을 검색합니다 (이 경우 “중지됨”).{print $<n>}
-n 열을 인쇄합니다. 구분 기호가 중단 된 것으로 정의되므로 중단 된 이후의 모든 항목이 두 번째 열로 간주됩니다.