Извлечение информации между двойными кавычками в файле.csv

systemd здесь прав. Вы пытаетесь запустить его из chroot, но chroot имеет совершенно другой набор путей, библиотек и сервисов. Разрешить вам вызывать systemctl было бы беспорядком :это правильная библиотека D -Bus? Версии systemctl внутри такие же, как у демона снаружи?

Если все, что вы хотите сделать, это использовать службу внутри chroot, у вас есть два варианта:

  • Используйте новые переносимые службы , представленные в systemd 239. Если вы хотите, чтобы внутренняя служба была доступна извне, то это то, что вам нужно.
  • Убедитесь, что systemd присутствует внутри chroot, и используйте systemd-nspawn --bootдля запуска отдельного экземпляра systemd внутри chroot. Затем вы можете включить его, и он будет действовать только внутри.

1
14.08.2020, 14:30
2 ответа

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

Вместо этого используйте подходящий язык программирования с поддержкой разбора CSV. Например, в питоне:

#!/bin/python3
import csv
import sys

with open(sys.argv[1], newline='') as csvfile:
    fieldnames = ("MsgID","Date","To","CC","BCC",
                  "Subject","Body","Status","Timestamp")
    reader = csv.reader(csvfile, delimiter=',',
    for row in reader:
        for fieldName, value in zip(fieldnames,row):
            print("%s: %s" % (fieldName,value))

Я сохранил скрипт выше как foo.py, а затем:

MsgID: #1
Date: 13/8/2020
To: somedude@hotmail.com
CC: otherdude@hotmail.com
BCC: 
Subject: Subject
Body: Dear Dude,

Information have been updated. Please login to APP to review by 30th August 2020. Thank you.

Best regards,
Mr. Mack
Status: Pending
Timestamp: 13/8/2020 12:35

Как видите, он правильно распознал все поля. Итак, чтобы также отправить почту, вы можете сделать что-то вроде этого (адаптировано отсюда):

#!/bin/python3
import csv
import sys
import subprocess
import os

def send_message(to, cc, bcc, subject, body):
    try:
        process = subprocess.Popen(['mail', '-s', subject, '-c', cc, '-b', bcc, to],
                                   stdin=subprocess.PIPE)
    except Exception as error:
      print(error)
    process.communicate(body)


with open(sys.argv[1], newline='') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    for row in reader:
        (msgID, date, to, cc, bcc, subj, body, status, timestamp) = row
        send_message(to, cc, bcc, subj, body)

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ :Похоже, вы используете BSD mail, судя по имеющимся у вас параметрам. У меня нет доступа к работающей системе с установленным этим инструментом, поэтому я не смог протестировать приведенный выше сценарий отправки почты. По крайней мере, это должно послужить хорошим началом.

3
18.03.2021, 23:12

Вы можете использовать такой инструмент, как Miller (https://github.com/johnkerl/miller), специализированный для работы со структурированными текстовыми данными.

В примере, начиная с этого input.txtфайла

#1,13/8/2020,somedude@hotmail.com,otherdude@hotmail.com,,Subject,"Dear Dude,

Information have been updated. Please login to APP to review by 30th August 2020. Thank you.

Best regards,
Mr. Mack",Pending,13/8/2020 12:35

и работает

mlr --implicit-csv-header --c2x cat then label MsgID,Date,To,CC,BCC,Subject,Body,Status,Timestamp input.txt

у вас будет

MsgID     #1
Date      13/8/2020
To        somedude@hotmail.com
CC        otherdude@hotmail.com
BCC
Subject   Subject
Body      Dear Dude,

Information have been updated. Please login to APP to review by 30th August 2020. Thank you.

Best regards,
Mr. Mack
Status    Pending
Timestamp 13/8/2020 12:35

Если вы хотите удалить возврат каретки в поле body, вы можете запустить

mlr --implicit-csv-header --c2x cat then label MsgID,Date,To,CC,BCC,Subject,Body,Status,Timestamp then put '$Body=gsub($Body,"\n"," ")' input.txt

иметь

MsgID     #1
Date      13/8/2020
To        somedude@hotmail.com
CC        otherdude@hotmail.com
BCC
Subject   Subject
Body      Dear Dude,  Information have been updated. Please login to APP to review by 30th August 2020. Thank you.  Best regards, Mr. Mack
Status    Pending
Timestamp 13/8/2020 12:35
0
18.03.2021, 23:12

Теги

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