【问题标题】:Replace arbitrary number of spaces with '#' (Awk for >1 spaces)用 '#' 替换任意数量的空格(>1 个空格的 Awk)
【发布时间】:2012-12-28 15:30:22
【问题描述】:

我正在尝试:

  • 获取文件/目录列表,并将过去 30 分钟内修改的所有文件的所有空格 >1 (NOT \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 的空格。唯一的问题是,目录列表的时间戳 arg 后面有一个空格...

今天有没有一种计算方法可以做到这一点?

  • 正在解析的日志文件包含约 26k 个条目
  • 输出被粘贴到 .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 的输出默认不是 {tab, comma} 分隔


关于我哪里出错了有什么建议吗?

【问题讨论】:

  • 您是否尝试过使用find -printf ... 而不是find -ls 这样您就不需要尝试解析查找输出?

标签: regex awk find replace ls


【解决方案1】:

这对我有用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,}/,"#")' 为:

具体来说,我想使用 {awk, sed, tr} 来替换 空间量大于 1(所以,我可以保留时间戳 arg)

$ 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

【讨论】:

  • 对我来说,将 's' 字符替换为 '#' - GNU Awk v.3.1.5(无法升级,不是我的机器)
  • 对不起 sudo_O,我辜负了你和社区 - 我没有意识到时间戳 arg 之后只有一个空格。编辑我的问题...今天是否存在可行的解决方案?
  • OFS 似乎是一个理想的选择,但是对于“#”分隔符的要求呢?我会 awk 吗?
  • @TylerJFisher 是的,看看我的编辑我相信第二个输出是你想要的,使用输出分隔符字段变量。
  • 第二次编辑没有使用“#”分隔符,它删除了很好的空格......但这没有帮助。:/
猜你喜欢
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多