Sokszor előfordulhat, hogy több fájlt kell egyetlen fájlba egyesíteni. Lehet, hogy korábban egyetlen fájlt több fájlra osztottál, és csak vissza akarod őket egyesíteni, vagy több naplófájlod van, amelyeket egybe szeretnél egyesíteni. Bármi legyen is az ok, nagyon egyszerű több szöveges fájlt egyetlen fájlba egyesíteni Linuxban.
A több fájl egyetlen fájlba történő összevonására vagy összevonására szolgáló parancsot Linuxban cat-nek hívják. A cat parancs alapértelmezés szerint több fájlt összefűz és kinyomtat a szabványos kimenetre. A standard kimenetet átirányíthatja egy fájlba a ‘>’ operátorral, hogy a kimenetet lemezre vagy fájlrendszerbe mentse.
A másik hasznos segédprogram a fájlok egyesítéséhez a join, amely két fájl sorait képes összekötni közös mezők alapján. Egyszerre azonban csak két fájlon tud dolgozni, és elég nehézkesnek találtam a használatát. Ebben a bejegyzésben főként a cat paranccsal foglalkozunk.
Minden fájl egyesítése egybe sorrendben
A cat parancs argumentumként egy fájlnevekből álló listát fogad el. A parancssorban megadott fájlnevek sorrendje határozza meg a fájlok összevonásának vagy egyesítésének sorrendjét. Ha tehát több fájl neve file1.txt, file2.txt, file3.txt stb…
bash$ cat file1.txt file2.txt file3.txt file4.txt > ./mergedfile.txt
A fenti parancs a file2.txt tartalmát a file1.txt végéhez csatolja. A file3.txt tartalma a file1.txt és a file2.txt összevont tartalmának végéhez csatolódik, és így tovább… és az egész összevont fájlt mergedfile.txt néven menti el az aktuális munkakönyvtárba.
Néhányszor előfordulhat, hogy rendkívül sok fájlunk van, ami megnehezíti az összes fájlnév beírását. A cat parancs elfogadja a reguláris kifejezéseket bemeneti fájlnevekként, így azokkal csökkentheti az argumentumok számát.
bash$ cat file*.txt my*.txt > mergedfile.txt
Az aktuális könyvtárban lévő összes olyan fájlt egyesíti, amelyek a file névvel kezdődnek és txt kiterjesztéssel rendelkeznek, majd azokat a fájlokat, amelyek my-vel kezdődnek és txt kiterjesztéssel rendelkeznek. A reguláris kifejezések használatával óvatosnak kell lennünk, ha meg akarjuk őrizni a fájlok sorrendjét. Ha rosszul használja a reguláris kifejezést, az befolyásolja a fájlok összevonásának pontos sorrendjét.
Egy gyors és egyszerű módja annak, hogy a fájlok pontosan a kívánt sorrendben legyenek összevonva, ha egy másik fájllistázó program, például az ls vagy a find kimenetét használja, és azt a cat parancsba továbbítja. Először hajtsa végre a find parancsot a reguláris kifejezéssel, és ellenőrizze a fájlok sorrendjét…
bash$ find . -name "file*.txt" -o -name "my*.txt"
Ez kiírja a fájlokat olyan sorrendben, hogy ellenőrizni tudja, hogy az helyes-e, vagy módosíthatja, hogy megfeleljen a kívántnak. Ezt a kimenetet aztán átvezetheti a cat parancsba.
bash$ find . -name "file*.txt" -o -name "my*.txt" | xargs cat > ./mergedfile.txt
Ha több fájlt egyesít egy fájlba, és ehhez reguláris kifejezéseket használ, különösen akkor, ha ez átvezetésre kerül, és ha a kimeneti fájl nem túl nyilvánvaló, győződjön meg róla, hogy a reguláris kifejezés nem egyezik az egyesített fájl fájl nevével. Abban az esetben, ha mégis egyezik, a cat parancs általában elég jól hibázik a “bemeneti fájl a kimeneti fájl” üzenettel. De segít, ha óvatosan kezdjük.
Két fájl összevonása tetszőleges helyen
Néha előfordulhat, hogy két fájlt szeretnénk összevonni, de a fájl tartalmán belül egy adott helyen. Ez inkább azt jelenti, hogy az egyik fájl tartalmát beillesztjük egy másik fájlba egy adott helyen.
Ha a fájlok mérete kicsi és kezelhető, akkor a vi egy nagyszerű szerkesztőeszköz erre a célra. Ellenkező esetben az a lehetőség, hogy először felosztjuk a fájlt, majd az így kapott fájlokat sorrendben egyesítjük. A legegyszerűbb a fájl felosztása a sorszámok alapján, pontosan ott, ahol a másik fájlt be akarja illeszteni.
bash$ split -l 1234 file1.txt
A fájlt az igényeitől függően tetszőleges számú kimeneti fájlra oszthatja fel. A fenti példa a file1.txt fájlt 1234 sorból álló darabokra osztja fel. Könnyen előfordulhat, hogy a végén kettőnél több, xaa, xab, xac stb. nevű fájl marad.Az összeset visszaolvaszthatja a korábban említett cat paranccsal.
bash$ cat xaa file2.txt xa{b..z}
A fenti parancs sorrendben egyesíti a fájlokat úgy, hogy a file2.txt tartalma az xaa és xab tartalma közé kerül.
A másik felhasználási eset, amikor bizonyos feltételektől függően csak bizonyos fájlok meghatározott részeit kell egyesíteni. Ez különösen akkor hasznos számomra, amikor több nagyméretű naplófájlt kell elemeznem, de csak bizonyos üzenetek vagy sorok érdekelnek. Tehát valamilyen feltétel alapján több naplófájlból ki kell emelnem a fontos naplóüzeneteket, és egy másik fájlba kell mentenem őket, miközben az üzenetek sorrendjét is megtartom vagy megőrzöm.
Noha ezt a cat és grep parancsokkal is megtehetjük, csak a grep paranccsal is megtehetjük.
bash$ grep -h "" logfile*.log > onlyerrors.log
A fenti parancs kiveszi az összes olyan sort, amely megfelel a mintának, és elmenti egy másik fájlba. Meg kell győződnie arról, hogy a naplófájlok sorrendben vannak, amikor a szabályos kifejezést használja a megfeleltetéshez, ahogy azt a bejegyzésben korábban említettük.