Углубился в изучение awk и задачу, в общем получилось решить, весьма просто.
Запускающий скрипт smbstatus-locked
#!/bin/bash
# Разбор вывода smbstatus что бы было понятно кто заблокировал файл
smbstatus | awk -f smbstatus.awk
И сам smbstatus.awk
function ConvertTime( s ) {
#Fri Aug 12 12:08:46 2022
#123456789012345678901234
syear = substr( s, 21, 4)
smonth = substr( s, 5, 3)
sday = substr( s, 9, 2)
stime = substr( s, 12, 8)
sub(/^[ ]/, "0", sday) # заменим пробел на 0 у дат меньше 10
switch( smonth ) { # заменим месяц с букв на цифры - так по ISO и сортировать удобно
case "Jan" : smonth = "01"; break
case "Feb" : smonth = "02"; break
case "Mar" : smonth = "03"; break
case "Apr" : smonth = "04"; break
case "May" : smonth = "05"; break
case "Jun" : smonth = "06"; break
case "Jul" : smonth = "07"; break
case "Aug" : smonth = "08"; break
case "Sep" : smonth = "09"; break
case "Oct" : smonth = "10"; break
case "Nov" : smonth = "11"; break
case "Dec" : smonth = "12"; break
case "янв" : smonth = "01"; break
case "фев" : smonth = "02"; break
case "мар" : smonth = "03"; break
case "апр" : smonth = "04"; break
case "май" : smonth = "05"; break
case "июн" : smonth = "06"; break
case "июл" : smonth = "07"; break
case "авг" : smonth = "08"; break
case "сен" : smonth = "09"; break
case "окт" : smonth = "10"; break
case "ноя" : smonth = "11"; break
case "дек" : smonth = "12"; break
}
return syear "-" smonth "-" sday " " stime
}
#---------------------------------------------------------------
BEGIN {
FS = " "
}
#---------------------------------------------------------------
# обработаем диапазон строк которые начинаются от PID до Service
# тут перечень PID и соответствующие им user и ip
# неинтересующие нас записи с user=nobody пропустим
/^PID/, /^Service/ {
if ($0 ~ /^[0123456789]/) {
if ($2 != "nobody" ) {
split($5, str, ":") # поле с ip-адресом разрежем по : что бы взять только сам ip, без типа протокола и без порта
spid[$1 "user"]=$2
spid[$1 "ip" ]=str[2]
# printf("%s|%s|%s \n", $1, spid[$1 "user"], spid[$1 "ip"])
}
}
}
#---------------------------------------------------------------
# обработаем диапазон строк которые начинаются от Locked files до конца файла
# к результату добавим расшифровку PID из массива spid набранного ранее
/^Locked files:/, /*/ {
if ($0 ~ /^[0123456789]/) {
i = index($0, "/" )
if (i > 0) {
# поделим строку на 2 части, по "/"
SL=substr($0, 1, i-1)
SR=substr($0, i)
# левую часть поделим в массив по разделителю "пробел"
# правую часть поделим в массив по разделителю "3 пробела подряд"
split(SL, L, " ")
split(SR, R, "[ ]{3}")
# преобразуем дату-время в человеческий вид и положим на то же место откуда взяли
R[3] = ConvertTime( R[3] )
# и собственно, вывод нужной нам информации
printf("| %7s | %10-s | %10-s | %10-s | %24-s | %10-s | %12-s | %s//%s\n",
L[1], L[3] , L[5] , L[6] , R[3], spid[L[1] "user"], spid[L[1] "ip"], R[1], R[2] )
# printf("| %7s | %6s | %10-s | %10-s | %10-s | %10-s | %24-s | %10-s | %12-s | %s//%s\n",
# L[1], L[2], L[3] , L[4] , L[5] , L[6] , R[3], spid[L[1] "user"], spid[L[1] "ip"], R[1], R[2] )
}
}
}
#---------------------------------------------------------------
По результату еще можно сделать sort и grep - и все Ок.