我有一个具有以下结构的文件:
#1552342335
ls
#1552342359
date
#1552342380
cat .bash_history
即时间戳后跟文本行。我想使用 shell 的date
(类似于date -d ${1/\#/@} '+%F %T'
)处理每个时间戳行,将其与下一行合并并用表标签包装,即输出如下:
<tr> <td>2019-03-11 18:12:15</td> <td><pre>ls</pre></td> </tr>
<tr> <td>2019-03-11 18:12:39</td> <td><pre>date</pre></td> </tr>
<tr> <td>2019-03-11 18:13:00</td> <td><pre>cat .bash_history</pre></td> </tr>
我知道它会是这样的awk 'NR % 2 {print | " <something here>" } !(NR % 2) {p=$0}' input_file
- 但我找不到在一个命令中实现所有必要转换的方法。
答案1
通过 GNU Awk ( gawk
),您可以使用内置的strftime
:
gawk '
NR%2 {ts = strftime("%F %T",substr($0,2)); next}
{printf("<tr> <td>%s</td> <td><pre>%s</pre></td> </tr>\n",ts,$0)}
' input_file
<tr> <td>2019-03-11 18:12:15</td> <td><pre>ls</pre></td> </tr>
<tr> <td>2019-03-11 18:12:39</td> <td><pre>date</pre></td> </tr>
<tr> <td>2019-03-11 18:13:00</td> <td><pre>cat .bash_history </pre></td> </tr>
答案2
请注意以下代码缺乏错误处理。解释通过内嵌注释的方式嵌入
awk '{
#strip leading "#", run through date and read into $0
gsub(/^#/, ""); "date -d @"$0" \"+%F %T\"" | getline;
#wrap with table tags and print
printf "<tr> <td>%s</td>", $0;
#read the subsequent "non-date" line
getline;
#wrap with table tags and print
printf " <td><pre>%s</pre></td> </tr>\n", $0
}' file