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
.
.
.
2行目次の行の場合は、その行の最後のフィールドを印刷します。最後のフィールドの内容まで「拡張」して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
1行目から2行目まで削除して置き換えるという意味です。tail
- ubstitute コマンドは
s
最後の空白より前のすべてのエントリを削除するため、列数を数える必要はありません。
私が知っている限り、システムコールにはスペースを含めることができないので、これはうまくいきます。それ以外の場合は、文字 61 で始まり、最初の 60 文字を削除する名前を使用できます。
sed '1,2d;s/.\{60\}//'
答え4
GNUgrep
と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