Записать результат команды AWK в новый файл CSV

Как уже упоминалось, ответ Филипа , это ожидаемое поведение, поскольку ip netns execвыполняется в отдельном пространстве имен монтирования. Хитрость заключается только в том, чтобы запустить ssh(, который выполняет сетевое взаимодействие )через ip netns exec, а не всю команду sshfs.

То есть вместо этого:

ip netns exec secured sshfs -p PORT USER@HOST: MOUNTPOINT

Сделай это:

sshfs -o ssh_command="ip netns exec secured ssh" -p PORT USER@HOST: MOUNTPOINT

1
08.09.2021, 04:15
3 ответа

Я бы начал с

awk -F= 'NF==2{printf "%s%s",comma,substr($2,2);comma=","} END {printf "\n" }' source > dest

где

  • -F=использовать =как разделитель
  • NF==2выбор строки с 2 полями
  • substr($2,2)полоса ведущего пробела
  • sourceи destявляются исходным и конечным файлами.

если вы хотите сохранить свою программу, вы можете заменить

if (($1=="Acct-Session-Id")&&(start==1))
{wholeLine=wholeLine","$3;}

по

$1 ~ /Acct-Session-Id/ && (start==1) {wholeLine=wholeLine","substr($2,2);}

и удалите окружающие {... }, как указал @berndbausch.

1
08.09.2021, 05:41

Далее я предполагаю, что ваши входные данные всегда отсортированы правильным образом, т. е. каждый блок от «Имя пользователя -» до «Отметка времени» содержит данные, которые вы хотите извлечь, в правильном порядке, а «Событие -Отметка времени" предпоследняя.

В этом случае вы можете просто использовать возможность awkработать с диапазонами, определенными совпадениями с образцом:/start/,/end/.

'BEGIN { FS=" = " }
/User-Name/,/Event-Timestamp/ {printf "%s,",$2}
/ Timestamp/ {print $2}'

Обратите внимание, что при совпадении с шаблоном "/ Timestamp/" в начале должен быть пробел, чтобы не было совпадения с "Event -Timestamp". Другие появления совпадающих шаблонов не учитываются и могут нарушить сценарий.

Пример ввода:

Sun Aug 22 19:00:00 2021
        User-Name = "407359687"
        Acct-Status-Type = Interim-Update
        Acct-Output-Octets = 3263901190
        Acct-Session-Id = "PPP3092201SSG0001006b0a55AABODS"
        Acct-Session-Time = 1146851
        Acct-Output-Gigawords = 15
        Event-Timestamp = "Aug 22 2021 18:55:32 +08"
        Timestamp = 1629630000
RANDOM ANNOYANCE
AND AN EMPTY LINE

Sun Aug 22 19:00:00 2021
        User-Name = "407359687"
        Acct-Status-Type = Interim-Update
        Acct-Output-Octets = 3263901190
        Acct-Session-Id = "PPP3092201SSG0001006b0a55AABODS"
        Acct-Session-Time = 1146851
        Acct-Output-Gigawords = 15
        Event-Timestamp = "Aug 22 2021 18:55:32 +08"
        Timestamp = 1629630000

образец вывода:

"407359687",Interim-Update,3263901190,"PPP3092201SSG0001006b0a55AABODS",1146851,15,"Aug 22 2021 18:55:32 +08",1629630000
"407359687",Interim-Update,3263901190,"PPP3092201SSG0001006b0a55AABODS",1146851,15,"Aug 22 2021 18:55:32 +08",1629630000

РЕДАКТИРОВАТЬ:

В соответствии с требованием исключения «Acct -Status -Type = Start» я предлагаю запустить вторую реализацию awk, удалив такие строки:

awk '...above code...' file | awk -F, '$2!="Start"'
1
08.09.2021, 05:55

Предполагая, что восемь полей каждой записи всегда присутствуют, расположены в правильном порядке и не требуют дальнейшей обработки, чтобы быть действительными в CSV-файле (, т. е. не требуется дополнительных кавычек или экранирования):

sed -n 's/^[^=]*= //p' file | paste -d, - - - - - - - -

При этом удаляются все строки, не содержащие знаков равенства, за которыми следует пробел (, или строки, в которых подстрока = не содержит первого знака равенства в строке ), а затем удаляется весь текст до пробел после первого знака равенства.

Затем он использует pasteдля создания восьми разделенных запятыми -столбцов оставшихся данных.

Тестирование файла, содержащего данные вашего примера, дважды:

$ sed -n -e 's/^[^=]*= //p' file | paste -d, - - - - - - - -
"407359687",Interim-Update,3263901190,"PPP3092201SSG0001006b0a55AABODS",1146851,15,"Aug 22 2021 18:55:32 +08",1629630000
"407359687",Interim-Update,3263901190,"PPP3092201SSG0001006b0a55AABODS",1146851,15,"Aug 22 2021 18:55:32 +08",1629630000

Удаление любой строки с Startво втором столбце (для фильтрации разделов, содержащих Acct-Status-Type = Startв исходных данных ), можно выполнить, передав результат через

awk -F, '$2 != "Start"'
2
08.09.2021, 06:00

Теги

Похожие вопросы