GNU/Linux >> Znalost Linux >  >> Linux

4 Základní a praktické použití příkazu Cut v systému Linux

Příkaz vyjmout je kanonický nástroj pro odstranění „sloupců“ z textového souboru. V tomto kontextu lze „sloupec“ definovat jako rozsah znaků nebo bajtů identifikovaných jejich fyzickou pozicí na řádku nebo rozsah polí oddělených oddělovačem.

O používání příkazů AWK jsem psal dříve. V tomto podrobném průvodci vysvětlím čtyři základní a praktické příklady příkazu cut v Linuxu, které vám hodně pomohou.

4 Praktické příklady příkazu Cut v Linuxu

Pokud chcete, můžete se podívat na toto video vysvětlující stejné praktické příklady příkazu cut, které jsem uvedl v článku.

1. Práce s rozsahy znaků

Při vyvolání pomocí -c příkazového řádku, příkaz vyjmout odstraní znak rozsahy.

Stejně jako jakýkoli jiný filtr, příkaz cut nezmění vstupní soubor na místě, ale zkopíruje upravená data na jeho standardní výstup. Je vaší odpovědností přesměrovat výstup příkazu do souboru pro uložení výsledku nebo použít roura k jeho odeslání jako vstupu do jiného příkazu.

Pokud jste si stáhli vzorové testovací soubory použité ve videu výše, můžete se podívat na BALANCE.txt datový soubor pocházející přímo z účetního softwaru, který moje žena používá ve své práci:

  Sh $ zůstatek hlavy.txtcAccDoc Acdocdate AccountNum Accdoclib Debet Credit4 1012017 623477 Příliv Alneenre-4701-LOC 0000000161540404040122012364 101201014364 1012010101640404040120120120150404012012012012012012012012012012. -LOC 00000001938,005 1012017 623372 ACCOMODATION GUIDE ALNEENRE-4771-LOC 00000001333,005 1012017 445452 VAT BS/ENC ALNEENRE-4771-LOC 00000000266,605 1012017 4356 PAYABLES ALNEENRE-4771-LOC 00000001599,606 1012017 4356 PAYABLES FACT FA00006253 - BIT QUIROBEN 00000001837,206 1012017 445452 DPH BS/ENC FACT FA000 06253 - BIT QUIROBEN 00000000306,206 1012017 623795 KNIHA TURISTICKÉHO PRŮVODCE FAKTA FA00006253 - BIT QUIROBEN 00000001531,00 

Toto je textový soubor s pevnou šířkou, protože datová pole jsou vyplněna proměnným počtem mezer, aby bylo zajištěno, že se zobrazí jako pěkně zarovnaná tabulka.

Důsledkem toho je, že datový sloupec vždy začíná a končí na stejné pozici znaku na každém řádku. Je tu však malé úskalí:navzdory svému názvu cut příkaz ve skutečnosti vyžaduje, abyste specifikovali rozsah dat, která chcete uchovat , nikoli rozsah, který chcete odebrat . Pokud tedy potřebuji pouze ACCOUNTNUM a ACCOUNTLIB sloupců v datovém souboru výše, napsal bych, že:

sh$ cut -c 25-59 BALANCE.txt | headÚČETNUM ÚČETLIB623477 ROZVRH PŘÍLIVU445452 DPH BS/ENC4356 /účetPAYABLES623372 PRŮVODCE UBYTOVÁNÍM445452 VAT BS/ENC4356 PAYABLES4356 PAYABLES445452 VAT BS/ENC4352 VAT BS/code>ENC6 IDE 

Co je to rozsah?

Jak jsme právě viděli, příkaz cut vyžaduje, abychom zadali rozsah dat, která si chceme ponechat. Pojďme si tedy představit formálněji, co je rozsah:pro cut je rozsah definován počáteční a koncovou pozicí oddělenými pomlčkou. Rozsahy jsou založeny na 1, to znamená, že první položka na řádku je číslo položky 1, nikoli 0. Rozsahy jsou včetně:začátek a konec budou ve výstupu zachovány, stejně jako všechny znaky mezi nimi. Je chybou zadat rozsah, jehož koncová pozice je před („nižší“) než počáteční pozice. Jako zkratku můžete vynechat začátek nebo koncová hodnota, jak je popsáno v tabulce níže:

  • a-b :rozsah mezi a a b (včetně)
  • a :ekvivalentní rozsahu a-a
  • -b :ekvivalentní 1-a
  • b- :ekvivalentní b-∞

Příkazy řezu umožňují zadat několik rozsahů oddělením čárkou. Zde je několik příkladů:

# Ponechat znaky od 1 do 24 (včetně)cut -c -24 BALANCE.txt# Zachovat znaky od 1 do 24 a 36 až 59 (včetně)cut -c -24,36-59 BALANCE.txt # Udržujte znaky od 1 do 24, 36 až 59 a 93 až do konce řádku (včetně)cut -c -24,36-59,93- BALANCE.txt 

Jedno omezení (nebo funkce, podle toho, jak to vidíte) cut příkaz je, že nikdy nezmění pořadí dat . Následující příkaz tedy vytvoří přesně stejný výsledek jako předchozí, přestože jsou rozsahy specifikovány v jiném pořadí:

cut -c 93-,-24,36-59 BALANCE.txt 

Můžete to snadno zkontrolovat pomocí diff příkaz:

diff -s <(cut -c -24,36-59,93- BALANCE.txt) \ <(cut -c 93-,-24,36-59 BALANCE.txt)Soubory /dev/ fd/63 a /dev/fd/62 jsou totožné 

Podobně cut příkaz nikdy neduplikuje data :

# Dalo by se očekávat, že by to mohl být způsob, jak zopakovat# první sloupec třikrát, ale ne...cut -c -10,-10,-10 BALANCE.txt | hlava -5ACCDOC4445 

Za zmínku stojí návrh na -o možnost zrušit tato dvě poslední omezení a umožnit cut nástroj pro změnu pořadí nebo duplikaci dat. To však výbor POSIX odmítl„protože tento typ vylepšení je mimo rozsah návrhu standardu IEEE P1003.2b.“

Pokud jde o sebe, neznám žádnou vystřiženou verzi implementující tento návrh jako rozšíření. Ale pokud ano, podělte se o to s námi pomocí sekce komentářů!

2. Práce s rozsahy bajtů

Při vyvolání pomocí -b příkazového řádku, příkaz vyjmout odstraní byte rozsahy.

Na první pohled není mezi charakterem patrný rozdíl a bajt rozsahy:

sh$ diff -s <(cut -b -24,36-59,93- BALANCE.txt) \ <(cut -c -24,36-59,93- BALANCE.txt)Soubory / dev/fd/63 a /dev/fd/62 jsou totožné 

Je to proto, že můj vzorový datový soubor používá kódování znaků US-ASCII („charset“) jako soubor -i příkaz to dokáže správně odhadnout:

sh$ soubor -i BALANCE.txtBALANCE.txt:text/plain; charset=us-ascii 

V tomto kódování znaků existuje mapování jedna ku jedné mezi znaky a bajty. Pomocí jednoho bajtu můžete teoreticky zakódovat až 256 různých znaků (číslice, písmena, interpunkční znaménka, symboly, …) V praxi je toto číslo mnohem nižší, protože kódování znaků umožňuje některé speciální hodnoty (jako je 32 nebo 65 řídicích znaků obecně nalezené). Každopádně, i kdybychom mohli použít celý rozsah bajtů, zdaleka by to nestačilo na uložení rozmanitosti lidského psaní. Takže dnes je mapování jedna ku jedné mezi znaky a byte spíše výjimkou než normou a je téměř vždy nahrazeno všudypřítomným vícebajtovým kódováním UTF-8. Podívejme se nyní, jak to zvládne příkaz cut.

Práce s vícebajtovými znaky

Jak jsem řekl dříve, ukázkové datové soubory použité jako příklady pro tento článek pocházejí z účetního softwaru, který používá moje žena. Je připojeno, že nedávno aktualizovala tento software a poté byly exportované textové soubory nepatrně odlišné. Nechal jsem vás, abyste si sami vyzkoušeli rozdíl:

  Sh $ zůstatek hlavy-v2.txtcAccDoc Acdocdate AccountNum Accdoclib Debet Credit4 1012017 623477 Příliv ALNEENRE-4701-LOC 00000001615,004 1012017 4445452 VAT BS/ECN ALNEENR -4701-LOC 00000001938,005 1012017 623372 ACCOMODATION GUIDE ALNÉENRE-4771-LOC 00000001333,005 1012017 445452 VAT BS/ENC ALNÉENRE-4771-LOC 00000000266,605 1012017 4356 PAYABLES ALNÉENRE-4771-LOC 00000001599,606 1012017 4356 PAYABLES FACT FA00006253 - BIT QUIROBEN 00000001837,206 1012017 445452 DPH BS/ENC FACT FA 00006253 - BIT QUIROBEN 00000000306,206 1012017 623795 KNIHA TURISTICKÉHO PRŮVODCE FAKTA FA00006253 - BIT QUIROBEN 00000001531,00 

Název této sekce vám může pomoci najít, co se změnilo. Ale ať už to bylo nalezeno nebo ne, podívejme se nyní na důsledky této změny:

sh $ cut -c 93-,-24,36-59 zůstatek-v2.txtccdoc acdocdate AccountLib Debet Credit4 1012017 Příliv 00000001615,004 1012017 AccosOmodation GUIDE 00000001333,005 1012017 VAT BS/ENC 00000000266,605 1012017 PAYABLES 00000001599,606 1012017 PAYABLES 00000001837,206 1012017 VAT BS/ENC 00000000306,206 1012017 TOURIST GUIDE BOOK 00000001531,0019 1012017 SEMINAR FEES 00000000080,0019 1012017 PAYABLES 00000000080,0028 1012017 MAINTENANCE 00000000746,5828 1012017 DPH BS/ENC 00000000149,3228 1012017 PAYABLES 00000000895,9031 1012017 PAYABLES 00000000240,0031 1012017 VAT BS/DEBIT 00000000040,0031 1012017 ADVERTISEMENTS 00000000200,0032 1012017 WATER 00000000202,2032 1012017 VAT BS/DEBIT 00000000020,2232 1012017 WATER 00000000170,2432 1012017 VAT BS/DEBIT 00000000009,3732 1012017 PATELKY 00000000402 0334 1012017 Náklady na pronájem 00000000018,0034 1012017 00000000018,0035 1012017 Různé poplatky 00000000015,0035 1012017 VAT BS/DeBit 000000112017120171201712017. 436 1012017 DPH BS/ENC 00000000013,83

Zkopíroval jsem výše uvedený výstup příkazu in-extenso takže by mělo být zřejmé, že se něco pokazilo se zarovnáním sloupců.

Vysvětlením je původní datový soubor obsahující pouze znaky US-ASCII (symbol, interpunkční znaménka, čísla a latinská písmena bez jakýchkoli diakritických znamének)

Pokud se však pozorně podíváte na soubor vytvořený po aktualizaci softwaru, uvidíte, že nový soubor exportovaných dat nyní zachovává písmena s diakritikou. Například společnost s názvem „ALNÉENRE“ je nyní správně napsána, zatímco dříve byla exportována jako „ALNEENRE“ (bez přízvuku)

soubor -i obslužnému programu tato změna neunikla, protože nyní hlásí, že soubor má kódování UTF-8:

sh$ soubor -i BALANCE-V2.txtBALANCE-V2.txt:text/plain; charset=utf-8 

Chcete-li vidět, jak jsou kódována písmena s diakritikou v souboru UTF-8, můžeme použít hexdump nástroj, který nám umožňuje podívat se přímo na bajty v souboru:

# Abychom zredukovali nepořádek, zaměřme se pouze na druhý řádek souborush$ sed '2!d' BALANCE-V2.txt4 1012017 623477 PLÁN PŘÍLIVU ALNÉENRE-4701-LOC 00000001615,00sh$ sed ' d' BALANCE-V2.txt | Hexdump -C00000000 34 20 20 20 20 20 20 20 20 20 31 30 31 32 30 31 | 4 101201 | 00000010 37 20 20 20 20 20 20 36 32 33 34 37 37 20 20 | 7 623477 | 00000020 20 20 54 49 44 45 20 53 43 48 45 44 55 4c 45 | HARMONOGRAM PŘÍLIVU|00000030 20 20 20 20 20 20 20 20 20 20 20 41 4c 4e c3 89 | 02 ALN..|00000040 45 4e 52 45 2d 34 37 30 31 2d 4c 4f 43 20 20 20 |ENRE-4701-LOC |00000050 20 20 20 20 2020 02 20 03 000|00000060 30 30 30 30 31 36 31 35 2c 30 30 20 20 20 20 20 |00001615,00 |00000070 20 20 20 202 20 0 | 0 | .|0000007c 

Na řádku 00000030 hexdump výstup po hromadě mezer (bajt 20 ), můžete vidět:

  • písmeno A je zakódován jako bajt 41 ,
  • písmeno L je zakódován do bytu 4c ,
  • a písmeno N je zakódován jako bajt 4e .

Ale velké LATINSKÉ VELKÉ PÍSMENO E S AKUTNÍM (jak je oficiální název písmene É ve standardu Unicode) je kódován pomocí dvou bajtů c3 89

A zde je problém:pomocí cut příkaz s rozsahy vyjádřenými jako pozice bajtů funguje dobře pro kódování s pevnou délkou, ale ne pro kódování s proměnnou délkou, jako je UTF-8 nebo Shift JIS. To je jasně vysvětleno v následujícím nenormativním výtahu standardu POSIX:

Dřívější verze obslužného programu cut fungovaly v prostředí, kde byly bajty a znaky považovány za ekvivalentní (modulo zpracování a v některých implementacích). V rozšířeném světě vícebajtových znaků byla přidána nová volba -b.

Hej, počkej chvíli! Nepoužil jsem -b možnost ve výše uvedeném „chybném“ příkladu, ale -c volba. Takže nemělo by které fungovaly?!?

Ano, mělo by :je to smůla, ale jsme v roce 2018 a navzdory tomu od GNU Coreutils 8.30 GNU implementace nástroje cut stále nezpracovává správně vícebajtové znaky. Abychom citovali dokumentaci GNU, -c volba je „Zatím totéž jako -b, ale internacionalizace to změní[… ]“ — zmínka, která existuje již více než 10 let!

Na druhou stranu, OpenBSD implementace nástroje cut je kompatibilní s POSIX a bude respektovat aktuální nastavení národního prostředí, aby správně zpracovávala vícebajtové znaky:

# Zajistěte, aby podřízené příkazy věděly, že používáme kódování UTF-8# text filesopenbsd-6.3$ export LC_CTYPE=en_US.UTF-8# S volbou `-c` funguje cut správně s vícebajtovými znakyopenbsd -6,3 $ cut -C -24,36-59,93- Balance-V2.txtAccDoc Acdocdate Accountlib Debet Credit4 1012017 Příliv 00000001615,004 1012017 Průstoje BS/ENC 000000003323,00120173333333333333333312017333333333305 1012017 Vat BS/ENC 00000000266666605 1012017 PACENÁNÍ 00000001599,606 1012017 PLATNĚNÍ 00000001837,206 1012017 VAT BS/ENC 00000000306,206 1012017 TURIST PUDIT 00001531,0019 10120120120120101201201201201201201201201201201201201201012012012012012012012012012012012012012017120171201712017120171201712017120171201712017120171201712017120171201712017. PAYABLES 00000000080,0028 1012017 MAINTENANCE 00000000746,5828 1012017 VAT BS/ENC 00000000149,3228 1012017 PAYABLES 00000000895,9031 1012017 PAYABLES 00000000240,0031 1012017 VAT BS/DEBIT 00000000040,0031 1012017 ADVERTISEMENTS 00000000200,0032 1012017 WATER 00000000202,2032 1012017 VAT BS/DEBIT 00000000020,2232 1012017 Voda 00000000170,2432 1012017 Vat BS/Debet 000000009 3732 1012017 Platby 000000000018355503000181835555010001818355555010101835555550101818355555530001812 7 DPH BS/DEBIT 00000000003,0035 1012017 ZÁVAZKY 00000000018,0036 1012017 PEVNÁ TELEFON 0000000069,1436 1012017 1012017 DPH 0000000000000000000000 

Podle očekávání při použití -b byte režimu namísto -c znakového režimu se implementace OpenBSD cut chová jako starší cut :

openbsd-6.3$ cut -b -24,36-59,93- ZŮSTATEK-V2.txtACCDOC ACCDOCDATE ÚČETLIB DEBETNÍ KREDIT4 1012017 HARMONOGRAM PŘÍLIVU 00000001615,004 1012017 02017 02017 0000400000000000000000000101615,004 1012017 02017 002017 0000 EN 004 00 EN 004 000 EN 0000 EN 00 004 00 EN 1012017 ACCOMODATION GUIDE 00000001333,005 1012017 VAT BS/ENC 00000000266,605 1012017 PAYABLES 00000001599,606 1012017 PAYABLES 00000001837,206 1012017 VAT BS/ENC 00000000306,206 1012017 TOURIST GUIDE BOOK 00000001531,0019 1012017 SEMINAR FEES 00000000080,0019 1012017 PAYABLES 00000000080,0028 1012017 ÚDRŽBA 00000000746,5828 1012017 DPH BS/ENC 00000000149,32 28 1012017 PAYABLES 00000000895,9031 1012017 PAYABLES 00000000240,0031 1012017 VAT BS/DEBIT 00000000040,0031 1012017 ADVERTISEMENTS 00000000200,0032 1012017 WATER 00000000202,2032 1012017 VAT BS/DEBIT 00000000020,2232 1012017 WATER 00000000170,2432 1012017 VAT BS/DEBIT 00000000009,3732 1012017 Platby 00000000402 0334 1012017 Náklady na pronájem 00000000018,0034 1012017 Platky 00000000018,0035 1012017 Různé poplatky 00000015,0035 1012017 VAT BS/DEBIT 00000000003,0035 10120183300300300300300300350012012012 0000069,1436 1012017 DPH BS/ENC 00000000013,83 

3. Práce s poli

V určitém smyslu je práce s poli v textovém souboru s oddělovači pro cut jednodušší obslužný program, protože bude muset pouze najít (jeden bajt) oddělovače polí na každém řádku a poté doslovně zkopírovat obsah pole do výstupu, aniž by se obtěžoval jakýmikoli problémy s kódováním.

Zde je ukázkový textový soubor s oddělovači:

sh$ head BALANCE.csvACCDOC;ACCDOCDATE;ACCOUNTNUM;ACCOUNTLIB;ACCDOCLIB;DEBIT;KREDIT4;1012017;623477;PLÁN PŘÍLIVU;ALNEENRE-4701-LOC;000000014515;0100014515;01V /ENC;ALNEENRE-4701-LOC;00000000323,00;4;1012017;4356;PLATY;ALNEENRE-4701-LOC;;00000001938,005;1012017;0012017;6237371EN;000000012017ACCOMALAC0372EN; 00003372 AC;1012017;445452;DPH BS/ENC;ALNEENRE-4771-LOC;00000000266,60;5;1012017;4356;PLATBY;ALNEENRE-4771-LOC;;0009,2003526EN;0009,2003526EN0159 -0009,2003526EN0159 -0101700603525001590010101010101017;;00000001837,206;1012017;445452;DPH BS/ENC;FACT FA00006253 - BIT QUIROBEN;000000000306,20;6;1012017;623795;0012017;623795;0012017;623795;0012017;623795; 0001012017;623795; 623795; 000120120017000F, 623795 GUIDE 023795; 

Tento formát souboru možná znáte jako CSV (pro hodnotu oddělenou čárkami), i když oddělovač pole není vždy čárka. Například středník (; ) se často vyskytuje jako oddělovač polí a je často výchozí volbou při exportu dat jako „CSV“ v zemích, které již používají čárku jako oddělovač desetinných míst (jako my ve Francii – proto jsem zvolil tento znak v mém vzorovém souboru ). Další oblíbená varianta používá jako oddělovač polí znak tabulátoru a vytváří to, čemu se někdy říká soubor hodnot oddělených tabulátory. Nakonec ve světě Unixu a Linuxu dvojtečka (: ) je další relativně běžný oddělovač polí, který můžete najít například ve standardním /etc/passwd a /etc/group soubory.

Při použití formátu textového souboru s oddělovači poskytnete příkazu cut rozsah polí, která se mají zachovat pomocí -f a musíte zadat oddělovač pomocí -d možnost (bez -d volba, obslužný program vyjmout výchozí znak tabulátoru pro oddělovač):

sh$ cut -f 5- -d';' BALANCE.csv | headAccDoclib; debet; creditalneenre-4701-loc; 00000001615,00; Alneenre-4701-LOC; 00000000323,00; Alneenre-4701-LOC;; 00000001938,00Alneneenre-4771-LOC; 00000001333,00; ,60;ALNEENRE-4771-LOC;;00000001599,60FACT FA00006253 - BIT QUIROBEN;;00000001837,20FACT FA00006253 - BIT QUIROBEN,03,03;003,022005003006020105003006000201FA 

Manipulační řádky neobsahující oddělovač

Co když ale některý řádek ve vstupním souboru oddělovač neobsahuje? Je lákavé si to představit jako řádek obsahující pouze první pole. Ale to není co nástroj cut dělá.

Ve výchozím nastavení při použití -f možnost, obslužný program cut vždy doslovně vypíše řádek, který neobsahuje oddělovač (pravděpodobně za předpokladu, že se jedná o nedatový řádek, jako je záhlaví nebo komentář nějakého druhu):

sh$ (echo "# 2018-03 BALANCE"; cat BALANCE.csv)> BALANCE-WITH-HEADER.csvsh$ cut -f 6,7 -d';' BALANCE-WITH-HEADER.csv | hlava -5# 2018-03 BALANCEDEBIT;KREDIT00000001615,00;00000000323,00;;00000001938,00 

Pomocí -s můžete toto chování zvrátit, takže cut bude vždy ignorovat takový řádek:

sh$ cut -s -f 6,7 -d';' BALANCE-WITH-HEADER.csv | hlava -5DEBIT;KREDIT00000001615,00;00000000323,00;;00000001938,0000000001333,00; 

Pokud máte hackerskou náladu, můžete tuto funkci využít jako relativně nejasný způsob, jak ponechat pouze řádky obsahující daný znak:

# Udržujte řádky obsahující `e`sh$ printf "%s\n" {mocný,tučný,skvělý}-{kondor,opice,medvěd} | cut -s -f 1- -d'e' 

Změna výstupního oddělovače

Jako rozšíření GNU implementace cut umožňuje použít pro výstup jiný oddělovač polí pomocí --output-delimiter možnost:

sh$ cut -f 5,6- -d';' --output-delimiter="*" BALANCE.csv | headAccDoclib*debet*CreditLeneenre-4701-LOC*00000001615,00*Alneenre-4701-LOC*00000000323,00*Alneenre-4701-LOC ** 00000001938,00ALNENEE-4771-LOC*00000001333,00*ALNENENS ,60*ALNEENRE-4771-LOC**00000001599,60FACT FA00006253 - BIT QUIROBEN**00000001837,20FACT FA00006253 - BIT QUIROBEN*0006,200003000FACT QUIROBEN*0006,2000030000000020000300010000000000000030000FACT 

Všimněte si, že v takovém případě budou nahrazeny všechny výskyty oddělovače polí, nejen ty na hranici rozsahů zadaných v argumentech příkazového řádku.

4. Rozšíření GNU jiná než POSIX

Když už mluvíme o rozšíření GNU mimo POSIX, několik z nich může být obzvláště užitečné. Stojí za zmínku, že následující rozšíření fungují stejně dobře s rozsahy bajtů, znaků (co to znamená v aktuální implementaci GNU) nebo polí:--complement

Představte si tuto možnost jako vykřičník v adrese sed (! ); místo zachování dat odpovídajících danému rozsahu cut uchová data NEVHODNÁ s rozsahem

# Ponechat pouze pole 5sh$ cut -f 5 -d';' BALANCE.csv |head -3ACCDOCLIBALNEENRE-4701-LOCALNEENRE-4701-LOC# Ponechat vše kromě pole 5sh$ cut --complement -f 5 -d';' ZŮSTATEK.csv |head -3ACCDOC;ACCDOCDATE;ACCOUNTNUM;ACCOUNTLIB;DEBIT;KREDIT4;1012017;623477;PLÁN PŘÍLIVU;00000001615,00;4;1012017;445452;000030203;VAT 0003/ENK03 

--zero-terminated (-z )

místo znaku nového řádku použijte znak NUL jako zakončení řádku. -z Tato možnost je zvláště užitečná, když vaše data mohou obsahovat vložené znaky nového řádku, například při práci s názvy souborů (protože nový řádek je platný znak v názvu souboru, ale NUL nikoli).

Abychom vám ukázali, jak -z možnost funguje, udělejme malý experiment. Nejprve vytvoříme soubor, jehož název obsahuje vložené nové řádky:

bash$ touch 

Předpokládejme nyní, že chci zobrazit prvních 5 znaků každého *.txt název souboru. Naivní řešení zde zcela selže:

sh$ ls -1 *.txt | cut -c 1-5BALANBALANEMPTYFILEWITHNAME. 

Možná jste již četli ls byl navržen pro lidskou spotřebu a jeho použití v příkazovém potrubí je anti-vzor (to skutečně je). Použijme tedy najít místo toho příkaz:

sh$ najít . -name '*.txt' -printf "%f\n" | cut -c 1-5BALANEMPTYFILEWITHNAME.BALAN 

a … to přineslo v podstatě stejný chybný výsledek jako dříve (ačkoli v jiném pořadí, protože ls implicitně třídí názvy souborů, něco, co najít příkaz nedělá).

Problém je v obou případech cut příkaz nedokáže rozlišit mezi znakem nového řádku, který je součástí datového pole (název souboru), a znakem nového řádku použitým jako značka konce záznamu. Ale pomocí bajtu NUL (\0 ), protože zakončovací znak řádku odstraňuje zmatky, takže můžeme konečně získat očekávaný výsledek:

# Bylo mi řečeno (?), že některé staré verze tr vyžadují k označení znaku NUL použití \000 místo \0# (dejte mi vědět, pokud potřebujete tuto změnu!)sh$ find . -name '*.txt' -printf "%f\0" | řez -z -c 1-5| tr '\0' '\n'BALANEMPTYBALAN 

S tímto nejnovějším příkladem se vzdalujeme od jádra tohoto článku, kterým byl cut příkaz. Takže vás nechám, abyste si sami zkusili přijít na význam funky "%f\0" za -printf argument najít nebo proč jsem použil tr příkaz na konci kanálu.

S příkazem Vyjmout lze udělat mnohem více

Právě jsem ukázal nejběžnější a podle mého názoru nejzásadnější použití příkazu Vyjmout. Příkaz můžete použít ještě praktičtějšími způsoby. Záleží na vašem logickém uvažování a představivosti.

Neváhejte použít sekci komentářů níže a zveřejnit své poznatky. A jako vždy, pokud se vám tento článek líbí, nezapomeňte jej sdílet na svých oblíbených webech a sociálních sítích!


Linux
  1. Linuxové příkazy:jobs, bg a fg

  2. Linux df příkaz

  3. 10 praktických příkladů příkazu Vyjmout v Linuxu pro výběr sloupců souboru

  1. Linux Cat Command:Použití a příklady

  2. Příkaz Linux Sed:Použití a příklady

  3. Příkaz Linux AWK – Příklady syntaxe použití Linuxu a Unixu

  1. Cut Command v Linuxu

  2. 5 Praktické příklady příkazu „cd“ v Linuxu

  3. Příklady příkazů cut v Linuxu