shell-history/internal/stats/stats.go

90 lines
1.6 KiB
Go

package stats
import (
"database/sql"
"fmt"
)
func Run(d *sql.DB) error {
var total int
d.QueryRow("SELECT COUNT(*) FROM history").Scan(&total)
fmt.Printf("Total commands: %d\n\n", total)
fmt.Println("Commands per host:")
rows, err := d.Query("SELECT hostname, COUNT(*) as cnt FROM history GROUP BY hostname ORDER BY cnt DESC")
if err != nil {
return err
}
for rows.Next() {
var host string
var cnt int
rows.Scan(&host, &cnt)
fmt.Printf(" %-30s %d\n", host, cnt)
}
rows.Close()
fmt.Println("\nTop 20 commands:")
rows, err = d.Query(`
SELECT
CASE INSTR(command, ' ')
WHEN 0 THEN command
ELSE SUBSTR(command, 1, INSTR(command, ' ') - 1)
END as cmd,
COUNT(*) as cnt
FROM history
GROUP BY cmd
ORDER BY cnt DESC
LIMIT 20
`)
if err != nil {
return err
}
for rows.Next() {
var cmd string
var cnt int
rows.Scan(&cmd, &cnt)
fmt.Printf(" %-30s %d\n", cmd, cnt)
}
rows.Close()
fmt.Println("\nCommands per month:")
rows, err = d.Query(`
SELECT SUBSTR(timestamp, 1, 7) as month, COUNT(*) as cnt
FROM history
GROUP BY month
ORDER BY month DESC
LIMIT 24
`)
if err != nil {
return err
}
for rows.Next() {
var month string
var cnt int
rows.Scan(&month, &cnt)
fmt.Printf(" %-10s %d\n", month, cnt)
}
rows.Close()
fmt.Println("\nTop 10 directories:")
rows, err = d.Query(`
SELECT working_dir, COUNT(*) as cnt
FROM history
GROUP BY working_dir
ORDER BY cnt DESC
LIMIT 10
`)
if err != nil {
return err
}
for rows.Next() {
var dir string
var cnt int
rows.Scan(&dir, &cnt)
fmt.Printf(" %-50s %d\n", dir, cnt)
}
rows.Close()
return nil
}