Szkriptek: Python, Perl, Bash, ...

Egy kis AWK segítség kérés

Sziasztok,

Próbáltam AWK scriptet írni, de nagyon nem ment, ezért megkértem a ChatGPT-t, hogy írja meg nekem. Az adott feladat, egy program kimenetét feldolgozni az alábbi módon:

1. sor nem kell, átlépjük
minden további sorban az első két mező elválasztása " " szóköz mentén, míg az utolsó rész ami egy - jel után van legyen a harmadik mező.

példa:

pelda.txt

    Header1 Header2 - Egyszó
Valami     Szöveg - Több szó is lehet
Másik Sor - Még egy hosszabb kifejezés - van benne kötőjel

A hozzátartozó AWK script:

awk 'NR > 1 { 
    # Az első két szót (szöveg1, szöveg2) elválasztjuk
    split($1, arr1, " ");  # A szöveg1-t és szöveg2-t első lépésben szétválasztjuk
    split($2, arr2, " ");  # A szöveg2 után is szétválasztjuk
    # Azokat az adatokat, amik a "-" után vannak, egy változóba tesszük
    text = substr($0, index($0, " - ") + 3)  # A "-" utáni szöveget változóba tesszük
    print arr1[1],",",arr2[1], ",", text  # Kinyomtatjuk az első két szót és a kifejezést
}' pelda.txt

Lehet ezt egyszerűsíteni, vagy "jóvanazúgy"? :)

Terraform: változók átadása

Sziasztok,

root modul:

module "resource_group" {
  for_each                                  =  var.customers
  source                                     =  "./modules/resource_group"
  customer_name                       =  each.value.name
  subscription_location                =  var.subscription.location
  subscription_locationshortname =  var.subscription.locationshortname
  subscription_environment         =  var.subscription.environment
  tags_owner                             =  var.tags.owner
  tags_deployed_by                    =  var.tags.deployedby
  tags_deployment_date             =  var.tags.deploymentdate 
  tags_cost_center                     =  var.tags.costcenter
  tags_snow_fgroup                    =  var.tags.snowfgroup
}

module "key_vault" {
  for_each                           =  module.resource_group.resource_group_name
  source                              =  "./modules/key_vault" 
  location                            =  module.resource_group.resource_group_location
  resource_group_name       =  module.resource_group.resource_group_name
  tenant_id                         =  var.subscription.tenantid
  tags_owner                      =  var.tags.owner
  tags_deployed_by             =  var.tags.deployedby
  tags_deployment_date      =  var.tags.deploymentdate 
  tags_cost_center              =  var.tags.costcenter
  tags_snow_fgroup            =  var.tags.snowfgroup
  depends_on = [
    module.resource_group.resource_group_name
  ]
}
 

resource_group output.tf-je:

output "resource_group_name" { value = azurerm_resource_group.rg.name }
output "resource_group_location" { value = azurerm_resource_group.rg.location }

plan kimenet:

│ Error: Invalid value for input variable │ │ on main.tf line 24, in module "key_vault": │ 24: location = module.resource_group.resource_group_location │ │ The given value is not suitable for module.key_vault.var.location declared at modules\key_vault\variables.tf:7,1-20: │ string required. ╵ ╷
│ Error: Invalid value for input variable │ │ on main.tf line 25, in module "key_vault": │ 25: resource_group_name = module.resource_group.resource_group_name │
│ The given value is not suitable for module.key_vault.var.resource_group_name declared at │ modules\key_vault\variables.tf:12,1-31: string required.

Mit ronthattam el?

Köszönöm!

[Megoldva]Python - Qt - PDF

Sziasztok,

A kérdés egyszerű: miért nem működik a következő kód?

from reportlab.pdfgen import canvas
from io import BytesIO
from PyQt6.QtCore import QBuffer, QIODevice
from PyQt6.QtPdf import QPdfDocument
from PyQt6.QtPdfWidgets import QPdfView
from PyQt6.QtWidgets import QApplication, QVBoxLayout, QWidget


def create_pdf_in_qbuffer():
    pdf_buffer = BytesIO()
    c = canvas.Canvas(pdf_buffer)
    c.drawString(100, 750, "Hello, ReportLab in QBuffer!")
    c.save()

    pdf_buffer.seek(0)

    # Save for debugging
    with open("debug_output.pdf", "wb") as f:
        f.write(pdf_buffer.getvalue())

    qbuffer = QBuffer()
    qbuffer.open(QIODevice.OpenModeFlag.WriteOnly)
    qbuffer.write(pdf_buffer.read())
    qbuffer.close()
    qbuffer.open(QIODevice.OpenModeFlag.ReadOnly)
    return qbuffer


def create_qpdfdocument_from_qbuffer(qbuffer):
    if qbuffer.size() == 0:
        print("Error: QBuffer is empty.")
        return None

    pdf_document = QPdfDocument(None)
    load_status = pdf_document.load(qbuffer)
    if load_status != QPdfDocument.Status.Ready:
        print("Failed to load PDF document. Status:", load_status)
        return None

    return pdf_document


def main():
    app = QApplication([])

    qbuffer = create_pdf_in_qbuffer()
    pdf_document = create_qpdfdocument_from_qbuffer(qbuffer)
    if pdf_document is None:
        print("Error: Could not create QPdfDocument")
        return

    pdf_view = QPdfView()
    pdf_view.setDocument(pdf_document)

    window = QWidget()
    layout = QVBoxLayout(window)
    layout.addWidget(pdf_view)
    window.setWindowTitle("QPdfDocument from QBuffer (Qt6)")
    window.resize(800, 600)
    window.show()

    app.exec()


if __name__ == "__main__":
    main()

[Megoldva] Find parancs találatában speciális karakter van, és ez miatt megáll

Sziasztok. Olyan problémába ütköztem, hogy szerettem volna egy olyan parancsot megírni és futtatni, ami egy megadott útvonalon rekurzívan megkeresi az összes jpg, jpeg, png kiterjesztésű filet, majd ezeknek a fileoknak az exif adataiból kikeresi az orientetion adatát, majd ha nem üres és nem egyenlő eggyel, akkor írja ki ezt a file nevet (a végső cél egy konverzió lesz, de egyelőre kiiratni akartom, mert hibára fut).Az alábbi parancs lett a végeredmény:
 

find "/home/Data/Pictures" -type f \( -iname \*.jpg -o -iname \*.jpeg -o -iname \*.png \) | parallel 'orientation="$(identify -format '%[EXIF:Orientation]\n' -- "{}" 2> /dev/null)"; if [ -n "$orientation" ] && [ "$orientation" != 1 ]; then echo "{}"; fi'

Ez le is futna rendben, ahogy egy apró tesztben kipróbáltam, viszont mikor az éles könyvtáron akartam kipróbálni, akkor jött egy hibaüzenet x másodperc múlva, miszerint a "Fender '62 Jaguar.jpg" -vel gondja van. És nem csoda, mert van benne egy ' jel, ami speciális karakternek minősül, és ezért pukkan meg.
Hogyan kellene kiegészíteni ezt a parancsot, hogy a speciális karaktereket ne annak értelmezze, hanem a file részének?

Alapvetően a cél a következő lenne:
Egy megadott útvonalon rekurzívan az összes képet keresse meg (mondjuk jpg, jpeg, png kiterjesztés, de tőlem mime alapján is kikeresheti az összes képformátumot), és amit talált képet, azon meg kell vizsgálnia, hogy az EXIF Orientation értéke van/létezik, és az nem egyenlő eggyel. Ha ilyet talál, akkor le kell futtatnia azon a fotón a következő parancsot: convert path/to/file -auto-orient /path/to/file

Mind az útvonal, mind a filenevek tartalmaznak speciális karaktereket.

A Discord botom nem válaszol a parancsokra

Sziasztok! Elkezdtem fejlesztgetni egy Discord botot python programozási nyelvben a discord.py használatával. Eddig hibátlanul működött most meg fogta azt nem működöik. Mikor lefutattom a python fájlt a bot csatlakozik a Discord-hoz de a parancsai nem működnek beírhatom bármelyiket nem válaszol egyikre sem, ha beírok egy olyan parancsot ami nem is létezik arra sem ír hibát a konzol pedig kéne neki. Visual studio code-ban írom és az se talál semmilyen hibát a kódban.Valaki tud valami magyarázatot arra és esetleg megoldást is hogy mi lehet a probléma? 

bash argumentumok továbbadása

Sziasztok! Vegyük az alábbi szkriptet, amit meghívok idétlen escapelt spaceokkal, és szeretném a szriptből ezeket megőrizve továbbadni. script.sh :

#!/bin/bash

PULSE_SINK="${some_value}" ${*} &
./script.sh ffplay "Egy\ video\ file.mp4"

Itt az ffplaynek fontos, hogy az "Egy\ video\ file.mp4" egy argumentumként érkezzen.

Ez nemcsak ffplay és ffmpeg-gel lesz használva, és a fileok spacementesítése nem jön szóba. Ötlet?

Regexp magus van itt? :)

parsolnom kene ilyen parametereket:

param1=abc

param2 = abc

param3 = "ab'c"

param4='a"b"c'

param5="abc=def"

egyaltalan megoldhato ez egy regexp-el? (most karakterenkent dolgozom fel...)

lenyeg hogy lehet ' es " is az idezojel (de nem is kotelezo) es azon belul a masik fajta idezojel sima karakterkent mukodik.

es akkor meg a \' nem is neztuk, de az talan nem is kell.

pythont hasznalok, ami elvileg perl regex kompatibilis nagyjabol...

[Megoldva] Időzítő bash script és cron

Kicsit agyaltam és lehet, hogy túlgondoltam az egészet. Majd ti megmondjátok, hogy hülye vagyok. Mindegy. Működik a következő script és crontab kombó a következő beállításokkal?

Hétfőn 20-kor leáll keddtől-csütörtökig 18-kor leáll, pénteken 16-kor leáll és minden hétköznap reggel 7.30-kor bekapcsol.

#!/bin/bash

current_day=$(date +%u)  # A hét napjának számát tároljuk el (1-7, hétfőtől vasárnapig)

case $current_day in
    1)  # Hétfő
        wake_after_minutes=690
        ;;
    [2-4])  # Kedd, Szerda, Csütörtök
        wake_after_minutes=810
        ;;
    5)  # Péntek
        wake_after_minutes=3810
        ;;
    *)  # Egyéb napokon
        wake_after_minutes=0
        ;;
esac

sh -c "echo 0 > /sys/class/rtc/rtc0/wakealarm"
sh -c "echo $(date '+%s' -d "+ $wake_after_minutes minutes") > /sys/class/rtc/rtc0/wakealarm"
shutdown -h now

És a crontab:

0 20 * * 1

0 18 * * 2-4

0 16 * * 5

Működhet a dolog?

[Megoldva] Szerver ütemezett be- és kikapcsolása

A kikapcsolással ugye nincs gondom. Cronrabba a megfelelő bejegyzés és rendben van. De a bekapcsolás már problémásabb. Találtam egy posztot, de nem tudom értelmezni az ott látható bash scriptet. Ebben kérem a segítségeteket:

/root/bin/shutwake.sh

# unset alarm, set new time
sh -c "echo 0 > /sys/class/rtc/rtc0/wakealarm" 
sh -c "echo `date '+%s' -d '+ 600 minutes'` > /sys/class/rtc/rtc0/wakealarm" 
/sbin/poweroff

# Then you need to add a line in cron to shutdown:

0     23      *       *       *       /root/bin/shutwake.sh

Ebből azt értem, hogy este 11-kor lefutassa a shutwake szkriptet. De mi is van benne? Mi is ez a wakealarm? Amit szeretnék: minden reggel mondjuk 6-kor bekapcsol a szerver és 22-kor kikapcsol.