strace에 의해 생성된 다음 내용을 간략하게 포함하는 큰 텍스트 파일이 있습니다.
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
42.93 3.095527 247 12512 unshare
19.64 1.416000 2975 476 access
13.65 0.984000 3046 323 lstat
12.09 0.871552 389 2239 330 futex
11.47 0.827229 77 10680 epoll_wait
0.08 0.005779 66 88 fadvise64
0.06 0.004253 4 1043 193 read
0.06 0.004000 3 1529 3 lstat
0.00 0.000344 0 2254 1761 stat
[...]
0.00 0.000000 0 1 fallocate
0.00 0.000000 0 24 access
0.00 0.000000 0 1 open
첫 번째 헤더 행을 제외하고 시스템 호출 열에 해당하는 각 행의 마지막 필드를 가져오고 싶습니다. 여기에는 다음이 포함됩니다.
- 공유 취소
- 사용할 권리
- 통계자료
- 퓨텍스
- epoll_wait
- .
- ..
- ...
이렇게 해봤는데
tail -n -13 seccomp | awk '{print $5}'
첫 번째 행을 무시할 수 있었지만 검색이 구체화되지 않아서 오류 줄이 포함된 행 중 일부가 무시되었습니다.
이것을 어떻게 구현합니까?
답변1
또는 다음과 같습니다:
awk 'NR>2 {print $NF}' seccomp
unshare
access
.
.
.
두 번째 줄 다음 줄의 경우 해당 줄의 마지막 필드를 인쇄합니다. 마지막 필드의 내용까지 "확장"하여 NF
필드 수를 저장합니다 .$NF
또는 필드가 없는 경우 전체 레코드입니다(공백으로만 구성되며 FS
기본값은 필드 구분 기호입니다).
답변2
grep
옵션 -o
(약식 )을 쉽게 사용할 수 있습니다 --only-matching
.
grep -o "\w*$" filename
\w
모든 단어 문자(영숫자 및 밑줄)와 일치합니다.\w*
여러 개의(0 포함) 단어 문자와 일치합니다.\w*$
줄 끝에서 여러 단어 문자 일치
tail -n +3
다른 사람들이 제안한 대로 헤더를 건너뛰려면 다음을 사용하십시오.
tail -n +3 filename | grep -o "\w*$"
출력은 다음과 같습니다:
unshare
access
lstat
futex
epoll_wait
fadvise64
read
lstat
stat
fallocate
access
open
답변3
그것 으로 sed
쉽습니다
sed '1,2d;s/.* //'
1,2d
d
첫 번째 줄부터 두 번째 줄까지 삭제하고 교체한다는 의미입니다.tail
- ubstitute 명령은
s
마지막 공백 이전의 모든 항목을 제거하므로 열 수를 계산할 필요가 없습니다.
내가 아는 한, 시스템 호출에는 공백이 포함될 수 없으므로 이것이 작동합니다. 그렇지 않으면 문자 61에서 시작하여 처음 60자를 제거하는 이름을 사용할 수 있습니다.
sed '1,2d;s/.\{60\}//'
답변4
GNU grep
및 tail
Perl 스타일 정규식 사용
grep -Po '.* \K.*' file | tail -12
unshare
access
lstat
futex
epoll_wait
fadvise64
read
lstat
stat
fallocate
access
open
grep -o '[^] ]*$' file | tail -12
unshare
access
lstat
futex
epoll_wait
fadvise64
read
lstat
stat
fallocate
access
open