Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Michal Švarc 22. 03. 2022, 06:59:57

Název: Jak převést rouru do bash scriptu?
Přispěvatel: Michal Švarc 22. 03. 2022, 06:59:57
Jednoduchá roura jako je třeba
Kód: [Vybrat]
pwd | ls se dá snadno převést na
Kód: [Vybrat]
SOUBORY=$(ls $(pwd)) (nalezeno zde (https://osy.pages.fel.cvut.cz/docs/cviceni/lab2/bash/))
když jsem ale zkusil převést
Kód: [Vybrat]
awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log | sort | uniq | tr -s '\n' ','na
Kód: [Vybrat]
failbanlog=$(tr -s '\n' ',' $(uniq $(sort $( awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log))))
dostanu tak akorát
Citace
sort: cannot read: 102.164.61.218: No such file or directory

log obsahuje něco jako
Kód: [Vybrat]
2022-03-22 06:37:55,991 fail2ban.actions        [90770]: NOTICE  [sshd] Ban 194.163.129.195
2022-03-22 06:39:20,425 fail2ban.filter         [90770]: INFO    [sshd] Found 176.111.173.242 - 2022-03-22 06:39:20
2022-03-22 06:42:10,058 fail2ban.filter         [90770]: INFO    [sshd] Found 92.255.85.135 - 2022-03-22 06:42:10
2022-03-22 06:48:10,435 fail2ban.filter         [90770]: INFO    [sshd] Found 61.177.172.175 - 2022-03-22 06:48:10
2022-03-22 06:49:47,895 fail2ban.filter         [90770]: INFO    [sshd] Found 179.43.187.173 - 2022-03-22 06:49:47
2022-03-22 06:52:11,570 fail2ban.filter         [90770]: INFO    [sshd] Found 112.85.42.124 - 2022-03-22 06:52:11
2022-03-22 06:52:15,043 fail2ban.filter         [90770]: INFO    [sshd] Found 112.85.42.124 - 2022-03-22 06:52:13
2022-03-22 06:52:17,072 fail2ban.filter         [90770]: INFO    [sshd] Found 112.85.42.124 - 2022-03-22 06:52:17
2022-03-22 06:52:17,131 fail2ban.actions        [90770]: NOTICE  [sshd] Ban 112.85.42.124
Název: Re:Jak převést rouru do bash scriptu?
Přispěvatel: Michal Kubeček 22. 03. 2022, 08:22:31
Jednoduchá roura jako je třeba
Kód: [Vybrat]
pwd | ls se dá snadno převést na
Kód: [Vybrat]
SOUBORY=$(ls $(pwd))
To není ani zdaleka totéž a je vlastně otázka, co si představujete, že by měl ten první příkaz vlastně dělat, protože ls nezpracovává svůj standardní vstup, takže i např. "echo ahoj | ls" prostě jen vypíše obsah aktuálního adresáře. Oproti tomu ten druhý příklad příkazu ls předá výstup pwd jako parametr(y).

Pokud chcete nahradit rouru, pak můžete použít process substitution a např.
Kód: [Vybrat]
cmd1 | cmd2přepsat na
Kód: [Vybrat]
cmd2 < <(cmd1)Používá se to např. pro konstrukce typu
Kód: [Vybrat]
while ...; do
done < <(some_cmd)
pokud potřebujete, aby tělo toho cyklu neběželo s vlastním environmentem, ale sdílelo ho se zbytkem skriptu.

V každém případě by ale bylo dobré začít tím, že si ujasníte, proč byste to vlastně chtěl takhle přepisovat. Ve vašem případě mi to moc jasné není, protože do command substitution můžete klidně dát i rouru:
Kód: [Vybrat]
failbanlog=$(awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log | sort | uniq | tr -s '\n' ',')
Název: Re:Jak převést rouru do bash scriptu?
Přispěvatel: Michal Švarc 22. 03. 2022, 09:09:08
Aha, zdá se že jsem došel k mylnému závěru při čtení toho článku.
Děkuji za odpověď.