외부 쉘 명령을 사용하여 두 줄마다 처리한 후 병합합니다.

외부 쉘 명령을 사용하여 두 줄마다 처리한 후 병합합니다.

다음과 같은 구조의 파일이 있습니다.

#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

관련 정보