Totin Nurkka

 Intro

Etusivu
Toti
Yhteyslomake


 Mietteet

Utopia

 Kujeet

Anonymiteetti
Asiattomuudet
Sotkusilppu
Teksti


 Epätaide

Epätaiteen alkeet
Kuvanlaadun parannus


 Psykometria

MSI-BPD

 Skriptit

merkkisiivous.sh
m358.sh
IRC-gateway


 International

Web proxies

 Teksti

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):
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:
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:
rar e pilkottu.part1.rar
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.