1

私はしようとしています:

  • ファイル/ディレクトリのリストを取得し、過去 30 分以内に変更されたすべてのファイルについて、1 より大きいすべてのスペース (\t ではない) を '#' に置き換えます。

出力例:find / -mmin -30 -ls

310116371    0 -r--r--r--   1 root     root            0 Jan 14 0814 /proc/4732/wchan
310116373    0 -r--r--r--   1 root     root            0 Jan 14 0814 /proc/4732/schedstat
310116374    0 -r--r--r--   1 root     root            0 Jan 14 0814 /proc/4732/cpuset
310116383    0 -r--r--r--   1 root     root            0 Jan 14 0814 /proc/4732/oom_score
310116384    0 -rw-r--r--   1 root     root            0 Jan 14 0814 /proc/4732/oom_adj
310116382    0 -rw-r--r--   1 root     root            0 Jan 14 0814 /proc/4732/loginuid
310116416    0 -r--------   1 root     root            0 Jan 14 0814 /proc/4732/limits
310116418    0 -r--r--r--   1 root     root            0 Jan 14 0814 /proc/4732/io

私が欲しいもの:

310116371#0#-r--r--r--#1#root#root#0#Jan 14 0814#/proc/4732/wchan

具体的には、{awk, sed, tr} を使用して、スペースの量が 1 より大きいスペースを置き換えたいと考えています。唯一の問題は、ディレクトリ リストのタイムスタンプ引数の後に単一のスペースがあることです...

これを行うことができる今日存在する計算方法はありますか?

  • 解析中のログ ファイルは最大 26,000 エントリで構成されています
  • .XLS ファイルに貼り付けられる出力

私が試したこと:

find / -mmin -5 -ls |  awk '{gsub(/s+/,"#",$0); print;}'
find / -mmin -5 -ls |  awk '{gsub(/[' ']+/,"#")}1'
find / -mmin -5 -ls |  awk '{gsub(/["  "]+/,"#")}1'
find / -mmin -5 -ls | sed "s/^ *//;s/ *$//;s/ \{1,\}/#/g"
find / -mmin -5 -ls |  awk -D '{gsub([ +],"#",$0); print;}' 
find / -mmin -5 -ls |  awk '{gsub(/\t/,"#",$0); print;}'

問題: - の出力はfind / -mmin -5 -ls、デフォルトで {タブ、コンマ} で区切られていません


どこが間違っているのかについての提案はありますか?

4

1 に答える 1

2

これは私のためのトリックを行いますawk 'gsub(/\s+/,"#")':

$ awk 'gsub(/\s+/,"#")' file
310116371#0#-r--r--r--#1#root#root#0#Jan#14#0814#/proc/4732/wchan
310116373#0#-r--r--r--#1#root#root#0#Jan#14#0814#/proc/4732/schedstat
310116374#0#-r--r--r--#1#root#root#0#Jan#14#0814#/proc/4732/cpuset
310116383#0#-r--r--r--#1#root#root#0#Jan#14#0814#/proc/4732/oom_score
310116384#0#-rw-r--r--#1#root#root#0#Jan#14#0814#/proc/4732/oom_adj
310116382#0#-rw-r--r--#1#root#root#0#Jan#14#0814#/proc/4732/loginuid
310116416#0#-r--------#1#root#root#0#Jan#14#0814#/proc/4732/limits
310116418#0#-r--r--r--#1#root#root#0#Jan#14#0814#/proc/4732/io

またはawk 'gsub(/\s{2,}/,"#")':

具体的には、スペースの量が 1 より大きいスペースを置き換えるために {awk, sed, tr} を使用したい (したがって、タイムスタンプ引数を保持できます)

$ awk 'gsub(/\s{2,}/,"#")' file
310116371#0 -r--r--r--#1 root#root#0 Jan 14 0814 /proc/4732/wchan
310116373#0 -r--r--r--#1 root#root#0 Jan 14 0814 /proc/4732/schedstat
310116374#0 -r--r--r--#1 root#root#0 Jan 14 0814 /proc/4732/cpuset
310116383#0 -r--r--r--#1 root#root#0 Jan 14 0814 /proc/4732/oom_score
310116384#0 -rw-r--r--#1 root#root#0 Jan 14 0814 /proc/4732/oom_adj
310116382#0 -rw-r--r--#1 root#root#0 Jan 14 0814 /proc/4732/loginuid
310116416#0 -r--------#1 root#root#0 Jan 14 0814 /proc/4732/limits
310116418#0 -r--r--r--#1 root#root#0 Jan 14 0814 /proc/4732/io

# Single spacing
$ awk 'gsub(/\s{2,}/," ")' file
310116371 0 -r--r--r-- 1 root root 0 Jan 14 0814 /proc/4732/wchan
310116373 0 -r--r--r-- 1 root root 0 Jan 14 0814 /proc/4732/schedstat
310116374 0 -r--r--r-- 1 root root 0 Jan 14 0814 /proc/4732/cpuset
310116383 0 -r--r--r-- 1 root root 0 Jan 14 0814 /proc/4732/oom_score
310116384 0 -rw-r--r-- 1 root root 0 Jan 14 0814 /proc/4732/oom_adj
310116382 0 -rw-r--r-- 1 root root 0 Jan 14 0814 /proc/4732/loginuid
310116416 0 -r-------- 1 root root 0 Jan 14 0814 /proc/4732/limits
310116418 0 -r--r--r-- 1 root root 0 Jan 14 0814 /proc/4732/io

編集:

OFS変数を設定するだけではどうですか:

# Hash seperated
$ awk 'BEGIN{OFS="#"}{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11}' file
310116371#0#-r--r--r--#1#root#root#0#Jan#14#0814#/proc/4732/wchan
310116373#0#-r--r--r--#1#root#root#0#Jan#14#0814#/proc/4732/schedstat
310116374#0#-r--r--r--#1#root#root#0#Jan#14#0814#/proc/4732/cpuset
310116383#0#-r--r--r--#1#root#root#0#Jan#14#0814#/proc/4732/oom_score
310116384#0#-rw-r--r--#1#root#root#0#Jan#14#0814#/proc/4732/oom_adj
310116382#0#-rw-r--r--#1#root#root#0#Jan#14#0814#/proc/4732/loginuid
310116416#0#-r--------#1#root#root#0#Jan#14#0814#/proc/4732/limits
310116418#0#-r--r--r--#1#root#root#0#Jan#14#0814#/proc/4732/io

# Hash sperated accounting for the spaces in the date
$ awk 'BEGIN{OFS="#"}{print $1,$2,$3,$4,$5,$6,$7,$8" "$9" "$10,$11}' file
310116371#0#-r--r--r--#1#root#root#0#Jan 14 0814#/proc/4732/wchan
310116373#0#-r--r--r--#1#root#root#0#Jan 14 0814#/proc/4732/schedstat
310116374#0#-r--r--r--#1#root#root#0#Jan 14 0814#/proc/4732/cpuset
310116383#0#-r--r--r--#1#root#root#0#Jan 14 0814#/proc/4732/oom_score
310116384#0#-rw-r--r--#1#root#root#0#Jan 14 0814#/proc/4732/oom_adj
310116382#0#-rw-r--r--#1#root#root#0#Jan 14 0814#/proc/4732/loginuid
310116416#0#-r--------#1#root#root#0#Jan 14 0814#/proc/4732/limits
310116418#0#-r--r--r--#1#root#root#0#Jan 14 0814#/proc/4732/io

# Single space sperated 
$ awk 'BEGIN{OFS=" "}{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11}' file
310116371 0 -r--r--r-- 1 root root 0 Jan 14 0814 /proc/4732/wchan
310116373 0 -r--r--r-- 1 root root 0 Jan 14 0814 /proc/4732/schedstat
310116374 0 -r--r--r-- 1 root root 0 Jan 14 0814 /proc/4732/cpuset
310116383 0 -r--r--r-- 1 root root 0 Jan 14 0814 /proc/4732/oom_score
310116384 0 -rw-r--r-- 1 root root 0 Jan 14 0814 /proc/4732/oom_adj
310116382 0 -rw-r--r-- 1 root root 0 Jan 14 0814 /proc/4732/loginuid
310116416 0 -r-------- 1 root root 0 Jan 14 0814 /proc/4732/limits
310116418 0 -r--r--r-- 1 root root 0 Jan 14 0814 /proc/4732/io
于 2013-01-14T16:27:13.763 に答える