|
Käsittelen
harrasteissani suuria tietomääriä tekstimuodossa. Tässä esittelen
joitakin Linux-komentoja, jotka olen havainnut tarpeelliseksi
harrasteissani. Kyseessä on siistitty versio omasta muistilistastani.
Monet komennoista muokkaavat tiedostoa pysyvästi, eli jos leikit näiden
kanssa ensimmäistä kertaa, ota varmuuskopiot muokattavista tiedostoista.
Salaus
Yksittäisen tiedoston tehokas salaus (AES256):
| openssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 250000 -salt -in salaamaton.7z -out salattu.enc |
Vaatii openssl:n.
Samaisen tiedoston dekryptaus:
| openssl enc -aes-256-cbc -d -md sha512 -pbkdf2 -iter 250000 -salt -in salattu.enc -out salaamaton.7z |
Pakkaus
Erittäin tehokas pakkaus erityisesti tekstille (7z maksimiteholla):
Vaatii 7-Zipin.
Samaisen tiedoston purku:
Perus-tarballin purku:
ZST-arkistojen purku:
| tar --zstd -xvf paketti.tar.zst |
Pilkonta
Tiedoston pilkonta ilman pakkaamista:
| rar a -m0 -v7G pilkottu.rar isotiedosto.txt |
Vaatii RAR:n. Tämä tekisi esimerkiksi 13 gigatavun tiedostosta 2
tiedostoa, jotka ovat kooltaan 7 ja 6 gigatavua ja jotka voidaan purkaa takaisin
yhdeksi. Saman voi tehdä split-komennolla, mutta koen ikiajoilta tutun
RAR:n helpommaksi.
Samaisen osiin pilkotun paketin kokoaminen kasaan:
Kaikkien paketin osien tulee olla samassa kansiossa.
Tiedoston jako 50 000 rivin pätkiin (osa1.txt, osa2.txt jne):
| split -l 50000 --numeric-suffixes --additional-suffix=".txt" isotiedosto.txt osa |
Tiedoston jako 400 kilotavun pätkiin, suorittaa jaon (valitettavasti) myös kesken rivin:
| split -b 400k --numeric-suffixes --additional-suffix=".txt" isotiedosto.txt osa |
Siivous
Duplikaattirivien poisto tiedostosta:
| awk '{if (++dup[$0] == 1) print $0;}' tiedosto1.txt > tiedosto2.txt |
Nopeampi (erilainen) duplikaattirivien poisto:
| sort tiedosto1.txt > tiedosto2.txt && uniq tiedosto2.txt > tiedosto3.txt && rm tiedosto2.txt |
Tämä metodi toimii hyvin suurille tiedostoille tehokkaammin, mutta
järjestää myös rivit aakkosjärjestykseen eikä siksi ole aina sopiva.
Erikoismerkkien (ä, ö ym.) muunto perusmerkkivastineekseen (a, o ym.):
| iconv -f UTF-8 -t ASCII//TRANSLIT tiedosto1.txt > tiedosto2.txt |
Tekstitiedoston isojen kirjainten muunto pieniksi:
| tr '[:upper:]' '[:lower:]' < tiedosto1.txt > tiedosto2.txt |
Tiedoston rivien järjestäminen aakkosjärjestykseen:
| sort tiedosto1.txt > tiedosto2.txt |
Tiedoston rivien järjestäminen rivin pituuden mukaan:
| awk '{ print length, $0 }' vanha.txt | sort -n | cut -d' ' -f2- > uusi.txt |
Tiedostonimien muokkaus
Erikoismerkkien melko toimiva poisto (ei siis korvaaminen) kansion tiedostojen nimistä:
| for file in *; do mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9.-]//g'); done & |
Viivalla alkavien tiedostojen siirto toisaalle:
| find . -type f -name "-*" -exec cp {} /viivatiedostot/ \; |
Viivalla alkavat tiedostonimet ovat hankalia käsiteltäviä, joten niistä
kannattaa usein hankkiutua eroon. Tämä kopioi viivalla alkavat
tiedostot viivatiedostot-kansioon, jossa viivat
voi sitten helposti poistaa tiedostonimistä graafisen käyttöliittymän omaavan Bulk Renamen
avulla.
Samaisten tiedostojen poisto alkuperäisestä kansiostaan:
| find . -type f -name "-*" -exec rm {} \; |
Uudelleennimeä tiedostot toisaalla Bulk Renamella viivat poistaen ja siirrä uudelleennimetyt entisten tilalle.
Täysin päätteettömille tiedostoille päätteen antaminen (tässä esimerkissä .md-pääte):
| find . -type f ! -name "*.*" -exec sh -c 'mv "$0" "$0.md"' {} \; |
Hälytykset
Äänimerkki; kätevä shell scriptin lopussa esimerkiksi pitkän operaation päätteeksi:
| speaker-test -t sine -f 1000 -l 1 |
Lyhyempi äänimerkki tilanteisiin, joissa piippausta joutuu kuulemaan tiheämpään:
| speaker-test -t sine -f 1000 -l 1 & sleep .2 && kill -9 $! |
HTML-koodi tekstiksi
Lynxiä hyödyntävä HTML:n muunto tekstiksi (shell script, vaatii Lynxin):
#!/usr/bin/env bash
find . -type f -name '*.htm*' | while IFS= read path
do
lynx -dump "$path" >"${path%%.htm*}.txt"
done |
Vaihtoehtoinen tapa, joka käyttää Lynxin sijasta html2textiä (shell script, vaatii html2textin):
#!/usr/bin/env bash
find . -type f -name '*.htm*' | while IFS= read path
do
html2text "$path" >"${path%%.htm*}.txt"
done |
Sisällön muokkaus
Merkkijonon "kissa" tai "koira" etsiminen tiedostosta ja hakusanan sisältävien rivien kokoaminen toiseen tiedostoon:
| grep 'kissa\|koira' tiedosto1.txt > tiedosto2.txt |
Toinen, vaihtoehtoinen tapa tehdä sama:
sed '/kissa\|koira/!d' tiedosto1.txt > tiedosto2.txt
|
Merkkijonon "koira" muunto merkkijonoksi "kissa":
| sed -i -e 's/koira/kissa/g' tiedosto.txt |
Niiden rivien poisto, jotka sisältävät merkkijonon "kissa naukuu":
| sed -i '/kissa naukuu/d' tiedosto.txt |
Niiden rivien etsintä, jotka sisältävät merkkijonon ".fi", pisteen kanssa, ja kokoaminen toiseen tiedostoon:
| grep '\.fi' tiedosto1.txt > tiedosto2.txt |
Esim. merkkijonon ' FI ' muunto muotoon ', FI ,' ja ' CH ' muotoon ', CH ,' (käsittelee isoja kirjaimia):
| sed -i 's/ \([A-Z][A-Z]\) /, \1 ,/g' tiedosto.txt |
Ajoittain käytännöllinen CSV-tiedostoja tekstimuotoisista listoista laatiessa.
Toinen variantti aiemmasta, joka sopii numeroille ja muuntaa esim. merkkijonon '5 4' muotoon '5,4' tai '3 1' muotoon '3,1':
| sed -i 's/\([0-9]\) \([0-9]\)/\1,\2/g' tiedosto.txt |
Erikoisuudet
Tagien poisto; muuntaa esimerkiksi json-tiedoston tekstimuodossa luettavammaksi:
| sed -e 's/<[^>]*>//g' tiedosto1.txt > tiedosto2.txt |
Sanan "kissa" sisältävien rivien sekä näitä seuraavien 2 rivin ja edeltävien 3 rivin sisällyttäminen koottavaan kohdetiedostoon:
| grep -A 2 -B 3 kissa tiedosto1.txt > tiedosto2.txt |
Tekstin väritys HTML-tagien avulla:
| <font color="red">Tämä teksti on punainen<font color="black"> |
Tämähän ei ole validia HTML:ää, mutta toimii mainiosti. Tageilla
varustettu tekstitiedosto muutetaan LibreOfficella HTML:ksi, jossa omat
alkutagit muutetaan sen jälkeen tekstieditorilla punaväritageiksi ja
lopputagit mustaväritageiksi. Tämän jälkeen tekstieditorilla muokattu
HTML-tiedosto avataan LibreOfficella ja tallennetaan esimerkiksi
RTF-muodossa. Näin tagatut sanat tai kohdat saadaan näkymään muuten
mustassa tekstissä punaisena ja siten erottumaan selvästi.
Rekursiivinen (myös alikansioihin kohdistuva) haku, joka etsii vain
.htm -päätteisiä tiedostoja jotka sisältävät merkkijonon "kissa" ja
kokoaa näistä riveistä oman tiedoston:
| grep -a -r --include "*.htm" kissa > /kohdekansio/kissatiedostot.txt |
Kohdetiedosto kannattaa sijoittaa toisaalla olevaan kansioon.
Eri sanojen esiintymismäärän laskeminen tekstistä:
| tr ' ' '\12' <tiedosto.txt| sort | uniq -c | sort -nr > lukumaara.txt |
Ennen tätä kannattaa melkein aina muuttaa tekstin kaikki kirjaimet kokonaan pieniksi.
Niiden tiedostojen poisto, joissa on merkkijono "kissa".
| grep -a -l kissa * | xargs rm |
Etsii merkkijonoa, eli poistaa myös tiedostot, joissa on esimerkiksi sana "maatiaiskissanpentu".
Niiden tiedostojen poisto, joissa on merkkijono "kissa" kirjainkoosta riippumatta:
| grep -a -i -l kissa * | xargs rm |
Tunnistaa merkkijonot kuten "kiSSa" tai "KotiKissalauma".
Tiedostot, joissa on sana "kissa" kootaan kokonaisuudessaan yhteen,
samaan tiedostoon.
| grep -l "kissa" * 2>/dev/null | xargs -d '\n' cat > /kohdekansio/kissatiedostot.txt |
Kohdetiedoston tulisi olla toisessa kansiossa.
|