Mange gange kan du have flere filer, der skal slås sammen til en enkelt fil. Det kan være, at du tidligere har delt en enkelt fil op i flere filer, og du vil bare flette dem tilbage, eller du har flere logfiler, som du vil have slået sammen til én. Uanset årsagen er det meget nemt at flette flere tekstfiler til en enkelt fil i Linux.
Kommandoen i Linux til at sammenkæde eller flette flere filer til en enkelt fil hedder cat. Cat-kommandoen vil som standard sammenkæde og udskrive flere filer til standardudgangen. Du kan omdirigere standardoutputtet til en fil ved hjælp af operatoren ‘>’ for at gemme output på disken eller i filsystemet.
Et andet nyttigt værktøj til at flette filer hedder join, der kan sammenføje linjer i to filer baseret på fælles felter. Det kan dog kun arbejde på to filer ad gangen, og jeg har fundet det ret besværligt at bruge. Vi vil mest dække cat-kommandoen i dette indlæg.
Sammenlægning af flere filer til én i rækkefølge
Kommandoen cat tager en liste af filnavne som argument. Den rækkefølge, som filnavnene er angivet i kommandolinjen, dikterer den rækkefølge, i hvilken filerne slås sammen eller kombineres. Så hvis du har flere filer med navnene file1.txt, file2.txt, file3.txt osv…
bash$ cat file1.txt file2.txt file3.txt file4.txt > ./mergedfile.txt
Overstående kommando vil føje indholdet af file2.txt til slutningen af file1.txt. Indholdet af file3.txt føjes til slutningen af det sammenlagte indhold af file1.txt og file2.txt osv… og hele den sammenlagte fil gemmes med navnet mergedfile.txt i den aktuelle arbejdskatalog.
Mange gange har du måske et uforholdsmæssigt stort antal filer, hvilket gør det sværere at skrive alle filnavne ind. Kommandoen cat accepterer regulære udtryk som indtastede filnavne, hvilket betyder, at du kan bruge dem til at reducere antallet af argumenter.
bash$ cat file*.txt my*.txt > mergedfile.txt
Dette vil flette alle de filer i den aktuelle mappe, der starter med navnet fil og har en txt-udvidelse, efterfulgt af de filer, der starter med my og har en txt-udvidelse. Du skal være forsigtig med at bruge regulære udtryk, hvis du ønsker at bevare rækkefølgen af filer. Hvis du laver et forkert regulært udtryk, vil det påvirke den nøjagtige rækkefølge, som filerne bliver slået sammen.
En hurtig og nem måde at sikre, at filerne bliver slået sammen i den nøjagtige rækkefølge, som du ønsker, er at bruge output fra et andet program til oplistning af filer, f.eks. ls eller find, og pipe det til kommandoen cat. Udfør først kommandoen find med det regulære udtryk og kontrollér filrækkefølgen …
bash$ find . -name "file*.txt" -o -name "my*.txt"
Dette vil udskrive filerne i en sådan rækkefølge, at du kan kontrollere, at den er korrekt, eller ændre den, så den passer til det, du ønsker. Du kan derefter pipe-føre dette output ind i kommandoen cat.
bash$ find . -name "file*.txt" -o -name "my*.txt" | xargs cat > ./mergedfile.txt
Når du fletter flere filer til én fil ved hjælp af regulære udtryk til at matche dem, især når det er piped, og hvor outputfilen ikke er særlig tydelig, skal du sikre dig, at det regulære udtryk ikke passer til filnavnet på den flettede fil. I det tilfælde, at det matcher, er cat-kommandoen normalt ret god til at fejlmelde med meddelelsen “input file is output file”. Men det hjælper at være forsigtig til at starte med.
Flette to filer på vilkårlig placering
Sommetider vil du måske gerne flette to filer, men på en bestemt placering i indholdet af en fil. Dette svarer mere til processen med at indsætte indholdet af en fil i en anden fil på en bestemt position i filen.
Hvis filstørrelserne er små og overskuelige, så er vi et godt redigeringsværktøj til at gøre dette. Ellers er muligheden at opdele filen først og derefter sammenføje de resulterende filer i rækkefølge. Den nemmeste måde at opdele filen på er baseret på linjenumrene, præcis der hvor du ønsker at indsætte den anden fil.
bash$ split -l 1234 file1.txt
Du kan opdele filen i et vilkårligt antal uddatafiler afhængigt af dit behov. Ovenstående eksempel vil opdele filen file1.txt i stykker på 1234 linjer. Det er meget muligt, at du ender med mere end to filer, der hedder xaa, xab, xac osv. du kan flette dem alle sammen igen ved hjælp af den samme cat-kommando som nævnt tidligere.
bash$ cat xaa file2.txt xa{b..z}
Overstående kommando vil flette filerne i rækkefølge med indholdet af file2.txt mellem indholdet af xaa og xab.
Et andet anvendelsestilfælde er, når du kun skal flette bestemte dele af visse filer afhængigt af en bestemt betingelse. Dette er især nyttigt for mig, når jeg skal analysere flere store logfiler, men kun er interesseret i visse meddelelser eller linjer. Så jeg skal udtrække de vigtige logmeddelelser baseret på nogle kriterier fra flere logfiler og gemme dem i en anden fil, mens jeg også opretholder eller bevarer rækkefølgen af meddelelserne.
Selv om du kan gøre dette ved hjælp af cat- og grep-kommandoerne, kan du også gøre det med blot grep-kommandoen.
bash$ grep -h "" logfile*.log > onlyerrors.log
Overstående vil udtrække alle de linjer, der passer til mønstret, og gemme dem i en anden fil. Du skal sørge for, at logfilerne er i orden, når du bruger det regulære udtryk til at matche dem, som nævnt tidligere i indlægget.