Mustand: sisu ei ole veel tehniliselt ega keeleliselt täielikult kontrollitud ega toimetatud.

Peatüki vaade

Linux/Unix/macOS käsurea kiirõpik

Praegu loed peatükki Teksti teisendamine: tr, cut, paste, column, strings, mis kuulub osasse Osa IV: Tekst, otsing ja automatiseerimine.

Teksti teisendamine: tr, cut, paste, column, strings

Loogika

Need käsud sobivad siis, kui tahad tekstivoo kuju kiiresti muuta ilma pikema skriptita. Need on seotud torude ja otsingupeatükkidega, sest neid kasutatakse sageli kohe pärast grep-i või enne sort-i.

Kiirülevaade

Eesmärk on muuta teksti kuju väikeste tööriistadega, kus iga käsk teeb ühe konkreetse sammu.

KäskMilleksMida tavaliselt näed
trmuuda või kustuta märkemuutunud tekstivoog
cutvõta välja välju või veergeainult valitud osad
pastepane read kõrvutiühendatud read
column -tjoonda tabelilaadseltloetavamad veerud
stringsotsi binaarfailist tekstiloetavad tekstijupid ridadena

Tüüpilised algaja vead

  • aetakse segi märkide muutmine ja väljade lõikamine
  • kasutatakse cut-i keeruka CSV peal, kus lihtne eraldaja ei pruugi piisata
  • oodatakse, et column muudab faili, kuigi ta ainult vormib väljundi ilusamaks

Kiirspikker

  • tr asendab või eemaldab märke
  • cut võtab välja veerge või välju
  • paste kleebib ridu kõrvuti
  • column vormib tabeli
  • strings kuvab binaarfailist loetavad tekstijupid

Käivita need käsud


echo 'tere maailm' | tr '[:lower:]' '[:upper:]'
echo 'a,b,c' | tr ',' '\n'

printf 'nimi:vanus:linn\nMari:20:Tartu\n' > andmed.txt
cut -d ':' -f 1 andmed.txt
cut -d ':' -f 1,3 andmed.txt

printf 'nimi vanus\nMari 20\nJaan 21\n' | column -t

Millal need kasulikud on

  • tr sobib lihtsaks märgivahetuseks
  • cut sobib lihtsa eraldajaga väljade võtmiseks
  • column teeb käsuväljundi loetavamaks
  • strings aitab uurida tundmatuid binaarfaile

Päris näide: teksti puhastamine ja veergudeks tegemine

Alusta nii:


cp data/sample-text.txt tekst.txt
head -n 3 tekst.txt

Kui tahad tekstist teha sõnade voo, sobib hästi:


tr ' ' '\n' < tekst.txt | head -n 20

Siin:

  • tr ' ' '\n' muudab tühikud reavahetusteks
  • üks mitmesõnaline rida laguneb sõnade reaks

Kui tahad kõik sõnad suurtähtedeks muuta:


tr '[:lower:]' '[:upper:]' < tekst.txt | head -n 3

See on hea näide, sest siin ei muudeta "mõtet", vaid ainult märkide kuju.

Päris näide: logirea tükeldamine

Fail data/app.log sobib hästi cut-i näitamiseks.


head -n 5 data/app.log
cut -d ' ' -f 1-4 data/app.log | head -n 5

Selle näite loogika:

  • eraldajaks on tühik
  • -f 1-4 võtab välja esimesed neli välja
  • näed kiiresti aega, logitaset, hosti ja moodulit

Kui tahad ainult logitasemeid:


cut -d ' ' -f 2 data/app.log | head -n 10

See on hiljem väga kasulik koos sort ja uniq -c-ga.

Päris näide: tee väljund loetavaks column abil

Kui tahad näidata logi lühikokkuvõtet veergudena, saab teha väikese vahefaili:


cut -d ' ' -f 1-4 data/app.log | head -n 10 | tr '=' ' ' | column -t

Siin toimub korraga mitu asja:

  • cut võtab logi alguse
  • tr '=' ' ' teeb võtme-väärtuse osad loetavamaks
  • column -t joondab väljundi veergudesse

Nii muutub käsuväljund kiirelt tabelina loetavaks.

Päris näide: strings

strings on kasulik siis, kui sisend ei ole tavaline tekstifail.

Lihtne näide süsteemi pealt:


strings /bin/ls | head -n 20

Siin:

  • /bin/ls on binaarfail
  • strings üritab sealt leida loetavaid tekstijuppe

See on hea meeldetuletus, et mitte kõik failid ei ole "lihtsalt tekst", isegi kui neist saab mõnikord teksti välja koukida.

UTF-8, täpitähed ja reavahetused

Tekstitöötluses on veel kaks praktilist detaili, mis tulevad väga kiiresti ette:

  • kodeering, tavaliselt UTF-8
  • reavahetuse kuju, tavaliselt LF või CRLF

Eesti tekstiga on see eriti tähtis, sest ÕÄÖÜ ei ole ASCII märgid.

Näide:


printf 'Õun\nÄmber\nÖö\nÜks\n' > tahed.txt
cat tahed.txt

Kui fail on UTF-8 kujul, näed täpitähti õigesti.

CRLF vs LF

Linuxis ja macOS-is on tavaline reavahetus LF. Windowsi failides kohtab tihti CRLF.

Näide:


printf 'üks\r\nkaks\r\n' > crlf.txt
cat crlf.txt
tr -d '\r' < crlf.txt > lf.txt

Siin:

  • \r\n teeb Windowsi moodi reavahetuse
  • tr -d '\r' eemaldab carriage return märgid
  • tulemuseks saad puhta LF-iga faili

Kui mõni tööriist käitub "imelikult", siis põhjus võib olla just reavahetustes, mitte käsus endas.

Minitest

  1. Muuda tekst käsuga tr suurtähtedeks.
  2. Lõika kooloniga eraldatud failist välja teine väli.
  3. Vorminda väike tabel column -t abil.
  4. Võta data/app.log failist välja ainult logitase käsuga cut.
  5. Tee ühest väikesest väljundist veeruline vaade column -t abil.

Peatüki täisspikker

Töövood

Eesmärk

need väikesed filtrid muudavad tekstivoo kuju kiiresti: märgid, väljad, veerud ja tabelid ilma eraldi skriptita

Põhikujud

  • echo 'tere maailm' | tr '[:lower:]' '[:upper:]'muuda suurtäheks
  • echo 'a,b,c' | tr ',' '\n'tee ridadeks
  • cut -d ':' -f 1 andmed.txtvõta esimene väli
  • cut -d ':' -f 1,3 andmed.txtvõta mitu välja
  • printf 'nimi vanus\nMari 20\n' | column -tjoonda tabel
  • strings /bin/ls | head -n 20loe binaarist tekst
  • pastekleebi veerge

Olulisemad lipud, märgid ja kiirnupud

  • [:lower:]väiketähed
  • [:upper:]suurtähed
  • cut -dvali eraldaja
  • cut -fvali väljad
  • column -tjoonda tabel
  • stringstekstijupid