Kujeet / Teksti

Käsittelen harrasteissani suuria tietomääriä tekstimuodossa. Tässä esittelen joitakin Linux-komentoja, jotka olen havainnut tarpeelliseksi harrasteissani. Seassa on kryptausta, pakkausta ja vastaavaa jota voi toki soveltaa mihin tahansa formaattiin. 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)

7z a -mx9 paketti *

Vaatii 7-Zipin.

• Samaisen tiedoston purku

7z x paketti.7z


• Perus-tarballin purku

tar -xvzf paketti.tar.gz


• ZST-arkistojen purku

tar --zstd -xvf paketti.tar.zst


Pilkonta:


• Tiedoston pilkonta ilman pakkaamista

7z a -mx0 -v7g pilkottu isotiedosto.txt

Tämä tekisi esimerkiksi 13 gigatavun tiedostosta 2 tiedostoa, jotka ovat kooltaan 7 ja 6 gigatavua ja jotka voidaan purkaa takaisin yhdeksi. Saman voi toki tehdä split-komennolla, mutta tämä on helpompi tapa.

• Samaisen osiin pilkotun paketin kokoaminen kasaan

7z x pilkottu.7z.001

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ä edeltävien 2 rivin ja seuraavien 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".

• Tiedostojen, joissa on sana "kissa" kokoaminen kokonaisuudessaan yhteen, samaan tiedostoon

grep -l "kissa" * 2>/dev/null | xargs -d '\n' cat > /kohdekansio/kissatiedostot.txt

Kohdetiedoston tulisi olla toisessa kansiossa.