2

私はファイルを持っています:

pablo tty8 Thu Nov 1 12:51:21 2012 still logged in 
(unknown tty8 Thu Nov 1 12:50:57 2012 - Thu Nov 1 12:51:21 2012 (00:00) 
pablo tty2 Thu Nov 1 12:50:39 2012 still logged in 
pablo tty7 Thu Nov 1 12:49:45 2012 - Thu Nov 1 12:50:56 2012 (00:01) 
(unknown tty7 Thu Nov 1 12:34:32 2012 - Thu Nov 1 12:49:45 2012 (00:15)

上記の日付のファイルを少し差し替えたいと思います。印刷したい:

pablo tty8 1351770681 still logged in 
(unknown tty8 1351770657 - 1351770681 (00:00) 
pablo tty2 1351770639 still logged in 
pablo tty7 1351770585 - 1351770656 (00:01) 
(unknown tty7 1351769672 - 1351770585 (00:15)

私はこのコマンドを試しました:

gawk --posix 'function my()
{"date -d \047"$0"\047 +%s" | getline b; 
gsub( /[A-Za-z]{3} [A-Za-z]{3} [0-9] ([0-9]{2}:){2}[0-9]{2} [0-9]{4}/,b ); print}
{ my() }' file

上記のコマンドは機能しません。

$ gawk --posix 'function my()
> {"date -d \047"$0"\047 +%s" | getline b; 
> gsub( /[A-Za-z]{3} [A-Za-z]{3} [0-9] ([0-9]{2}:){2}[0-9]{2} [0-9]{4}/,b ); print}
> { my() }' ta
date: błędna data: `pablo tty8 Thu Nov 1 12:51:21 2012 still logged in '
pablo tty8  still logged in 
(unknown tty8 1351897200 - 1351897200 (00:00) 
date: błędna data: `pablo tty2 Thu Nov 1 12:50:39 2012 still logged in '
pablo tty2 1351897200 still logged in 
date: błędna data: `pablo tty7 Thu Nov 1 12:49:45 2012 - Thu Nov 1 12:50:56 2012 (00:01) '
pablo tty7 1351897200 - 1351897200 (00:01) 
(unknown tty7 1351897200 - 1351897200 (00:15)

上記のコマンドを改善するにはどうすればよいですか?

ご協力ありがとうございました。

4

3 に答える 3

5

インストール済みの場合はvim、次のコマンドを試してください。

:%s/\v\w+\s\w+\s\d+\s\d+:\d+:\d+\s\d+/\=system('date +%s -d"'.submatch(0).'" | tr -d "\n"')/g

アイデアはとてもシンプルです。vim非常に速くすることができます。

于 2012-11-03T12:25:26.563 に答える
1

dateinを使用したソリューションは次のとおりですawk(おそらくgawkのみ)

awk --posix '
{
  while(match($0,/([[:alpha:]]{3} ){2}[^[:alpha:]]+[0-9]{4}/)){
    date_str=substr($0, RSTART, RLENGTH)
    "date -d \""date_str"\" +%s" | getline date_sec
    sub(date_str,date_sec,$0)
  }
  print
}
' $1

出力:

pablo tty8 1351745481 still logged in 
(unknown tty8 1351745457 - 1351745457 (00:00) 
pablo tty2 1351745439 still logged in 
pablo tty7 1351745385 - 1351745456 (00:01) 
(unknown tty7 1351744472 - 1351744472 (00:15)

ノート:

  1. match-substr組み合わせは、日付を含む部分文字列を抽出するために使用されます。
  2. 日付部分文字列を秒形式 ( )dateに変換し、秒を+%sdate_sec
  3. 文字列形式の日付を 2 番目の形式の日付に置き換えます。
  4. 一致が見つからなくなるまで繰り返します (一致が見つからmatchない場合は 0 を返し、whileループを終了します)
  5. gawk間隔式はwith--re-intervalまたは--posixoptionでのみ許可されます
于 2012-11-04T07:28:26.413 に答える