Как уже упоминалось, ответ Филипа , это ожидаемое поведение, поскольку 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
Я бы начал с
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.
Далее я предполагаю, что ваши входные данные всегда отсортированы правильным образом, т. е. каждый блок от «Имя пользователя -» до «Отметка времени» содержит данные, которые вы хотите извлечь, в правильном порядке, а «Событие -Отметка времени" предпоследняя.
В этом случае вы можете просто использовать возможность 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"'
Предполагая, что восемь полей каждой записи всегда присутствуют, расположены в правильном порядке и не требуют дальнейшей обработки, чтобы быть действительными в 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"'