Bash: jak zobrazit druhý až poslední sloupec

Alex

Bash: jak zobrazit druhý až poslední sloupec
« kdy: 25. 11. 2017, 18:17:17 »
Ahoj,

mám textový soubor ve kterém je výstup z SHA (hash a cesta k souboru) oddělený mezerou. Bohužel i názvy souboru mají mezeru, takže nemůžu přijít jak si zobrazit pouze cestu.

Nejlepší by bylo v awk definovat $1 do $NF - ale nikde jsem něco nenašel.

Jelikož hashe jsou stejně dlouhé, dalo by se nějak na 66 pozici vložit jiný oddělovač?

« Poslední změna: 27. 11. 2017, 08:54:11 od Petr Krčmář »


mik

Re:bash - jak zobrazit 2 až poslední sloupec
« Odpověď #1 kdy: 25. 11. 2017, 18:28:33 »
cut -d\  -f2-

rxgu

Re:bash - jak zobrazit 2 až poslední sloupec
« Odpověď #2 kdy: 25. 11. 2017, 18:44:25 »
Co třeba takhle?

 sha256sum * | sed 's/.\{64\}//'

rxgu

Re:bash - jak zobrazit 2 až poslední sloupec
« Odpověď #3 kdy: 25. 11. 2017, 18:45:20 »
Jinak když pošlete ten výstup, tak se na to klidně mrknu.

rxgu

Re:bash - jak zobrazit 2 až poslední sloupec
« Odpověď #4 kdy: 25. 11. 2017, 18:47:18 »
Co třeba takhle?

 sha256sum * | sed 's/.\{64\}//'

Jo a tady jsem nevkládal oddělovač, ale odstranil ten první sloupec.
(V mém případě z sha256sum.)


Alex

Re:bash - jak zobrazit 2 až poslední sloupec
« Odpověď #5 kdy: 25. 11. 2017, 19:07:54 »
Fungují obě varianty:
Kód: [Vybrat]
| cut -d\  -f2-
| sed 's/.\{64\}//'

Kvůli přehlednosti se mi víc líbí "cut", Nicméně se to musí ještě zpracovat. Prvním charakterem zůstává mezera. shasum generuje mezi hashem a názvem souboru dvě mezery. Všiml jsem si toho až teď.

rxgu

Re:bash - jak zobrazit 2 až poslední sloupec
« Odpověď #6 kdy: 25. 11. 2017, 19:16:23 »
Fungují obě varianty:
Kód: [Vybrat]
| cut -d\  -f2-
| sed 's/.\{64\}//'

Kvůli přehlednosti se mi víc líbí "cut", Nicméně se to musí ještě zpracovat. Prvním charakterem zůstává mezera. shasum generuje mezi hashem a názvem souboru dvě mezery. Všiml jsem si toho až teď.

V tom případě bude lepší varianta:
sha256sum * | sed -r 's/.{66}//'

Tohle by mělo odstranit i ty mezery na začátku, případně bude stačit upravit číslo ve složené závorce. Jinak více informací o sed je třeba tady:
http://www.theunixschool.com/2014/08/sed-examples-remove-delete-chars-from-line-file.html

Re:bash - jak zobrazit 2 až poslední sloupec
« Odpověď #7 kdy: 25. 11. 2017, 19:32:22 »
Ak máte súbor vstupne data.txt, tak

Kód: [Vybrat]
shasum "vstupne data.txt"
vypíše

Kód: [Vybrat]
f572d396fae9206628714fb2ce00f72e94f2258f  vstupne data.txt
POSIXový cut podporuje aj vypisovanie od konkrétneho poľa do konca:

Kód: [Vybrat]
shasum "vstupne data.txt" | cut -d' ' -f3-
Berieme dáta od tretieho poľa do konca. Druhé políčko je prázdne, lebo medzi hashom a názvom súboru sú dve medzery.

---

Alternatívne cez awk, tiež v POSIXe:

Kód: [Vybrat]
shasum "vstupne data.txt" | awk '{ print substr($0, 43) }'
Ak má hash 40 znakov a dva znaky sú na oddeľovacie medzery, zoberiem od 43 znaku z celého riadka ($0) do konca.
« Poslední změna: 25. 11. 2017, 19:34:56 od novotnyr »

Alex

Re:bash - jak zobrazit 2 až poslední sloupec
« Odpověď #8 kdy: 25. 11. 2017, 19:53:37 »
Alternatívne cez awk, tiež v POSIXe:

Kód: [Vybrat]
shasum "vstupne data.txt" | awk '{ print substr($0, 43) }'
Ak má hash 40 znakov a dva znaky sú na oddeľovacie medzery, zoberiem od 43 znaku z celého riadka ($0) do konca.


Řešení s awk pro mojí situaci funguje perfektně.

Jinak děkuju všem za odpovědi.

Re:bash - jak zobrazit 2 až poslední sloupec
« Odpověď #9 kdy: 25. 11. 2017, 20:01:06 »
Jo, až teraz mi napadlo: POSIX cut vie sekať aj od konkrétneho znaku, nielen od delimitera, čo je ešte kratší zápis

Kód: [Vybrat]
shasum "vstupne data.txt" | cut -c43-
"Zober od štyridsiatehotretieho znaku do konca".

standa12345

Re:Bash: jak zobrazit druhý až poslední sloupec
« Odpověď #10 kdy: 28. 11. 2017, 01:22:20 »
Další variace sedu - bez vazby na délku hashe:
cat filename | sed 's/^[^ ][^ ]* \(.*\)$/\1/'

standa12345

Re:Bash: jak zobrazit druhý až poslední sloupec
« Odpověď #11 kdy: 28. 11. 2017, 01:24:58 »
Nebo variace bez referencování (inspirace z předchozích přízpěvků):
cat filename | sed 's/^[^ ][^ ]* //'