다음과 같은 구조의 파일이 있습니다.
#1552342335
ls
#1552342359
date
#1552342380
cat .bash_history
즉, 타임스탬프 뒤에 텍스트 줄이 옵니다. 쉘 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