各行の最後の単語を取得します。

各行の最後の単語を取得します。

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,2dd1行目から2行目まで削除して置き換えるという意味です。tail
  • ubstitute コマンドはs最後の空白より前のすべてのエントリを削除するため、列数を数える必要はありません。

私が知っている限り、システムコールにはスペースを含めることができないので、これはうまくいきます。それ以外の場合は、文字 61 で始まり、最初の 60 文字を削除する名前を使用できます。

sed '1,2d;s/.\{60\}//'

答え4

GNUgreptailPerlスタイルの正規表現を使う

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

関連情報