Awk: размещение значений пустых ячеек - PullRequest
0 голосов
/ 12 марта 2020

Мне нужно рассчитать размер удаленного файла на пользователя из команды lsof в bash. Но есть несколько строк, в которых третий столбец является пустым, что приводит к проблемам суммирования значений.
Например, на прикрепленном изображении мне нужно показать общий размер по каждому типу пользователя для удаленных файлов, теперь из-за нескольких пустых ячеек в в третьем столбце количество столбцов не соответствует действительности, и, следовательно, полученные значения также не верны. Я пытался использовать несколько вариантов, чтобы заменить пустые ячейки каким-то фиктивным текстом, но это не очень хорошо работает, поэтому нужно предложить решение для этой проблемы, а также любую команду, чтобы показать результирующий размер в удобочитаемом формате?

Я пытался добавьте вывод по типу пользователя с помощью следующей команды

lsof|grep -i deleted| awk '{a[$5] +=$8} END{for (i in a) print i, a[$i]}'

Вышеуказанная команда не дала правильных результатов, поэтому я попытался из приведенной ниже команды заменить пустые ячейки фиктивным текстом

lsof|grep -i deleted| awk '!$3{$3="NA"}{a[$5] +=$8} END{for (i in a) print i, a[$i]}'

То не работает, поэтому я попытался использовать, если условие

lsof|grep -i deleted| awk '{if($3 =="") $3="NA"; a[$5] +=$8} END{for (i in a) print i, a[$i]}'

enter image description here

1 Ответ

0 голосов
/ 13 марта 2020

Если вы заинтересованы в владельце файла / размере / имени, вот сценарий python (test.py), который может их получить:

import re
import sys

user_last_column = 0
for line in sys.stdin:
    if  user_last_column:
        if  re.search(r'\(deleted\)$', line):
            print("%s %s %s" % (re.sub(r'.* ', '', line[:user_last_column]), 
                                re.sub(r'.* ', '', line[:size_last_column]),
                                line[name_first_column:][:-11]))
    else: # Process first row which is header
        user_last_column = line.find('USER') + 4
        size_last_column = line.find('SIZE/OFF') + 8
        name_first_column = line.find('NAME')

Вызовите его с помощью:

lsof | python test.py | sort -u # [sort -u] to remove duplicates 
or 
python test.py < /tmp/sample

Explanation Главное - найти позиции (в символах) трех частей информации.

...