Տպել տողեր երկու նախշերի միջև Linux-ում
Երկու նախշերի միջև գծեր տպելը ֆունկցիոնալ է, երբ դուք պետք է տպեք միայն մի քանի տող այս ֆայլերից կամ ձեր տողերը պահեք որոշակի օրինակի տակ:
Չնայած դուք կարող եք տպել տողերը grep հրամանի միջոցով, անհնար է տպել կոնկրետ տողը: Այս դեպքում դուք կարող եք օգտագործել հրամաններ, ինչպիսիք են sed կամ awk, երկու նախշերի միջև գծեր տպելու համար:
Այսպիսով, այս հոդվածում մենք կմշակենք տարբեր օրինակներ Linux-ում երկու օրինաչափությունների միջև գծեր տպելու համար: Մենք նաև կներառենք բազմաթիվ պայմաններ՝ sed և awk հրամանն օգտագործելու համար՝ նախշերի միջև գծեր տպելու համար:
Linux-ում երկու օրինաչափությունների միջև գծերի տպում
Նախ, մենք կստեղծենք օրինակ.txt ֆայլ, որը պարունակում է հետևյալ բովանդակությունը −
cat example.txt
Information Start
Professional Details:
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint
Information End
Information Start
Personal Details:
Address: House No. XX Street 254/76
Age: 26 Years
Information End
Ինչպես տեսնում եք վերը նշված ելքում, այս ֆայլն ունի երկու բաժին՝ «Տեղեկատվության սկիզբ» և «Տեղեկատվության ավարտ»: Այսպիսով, եկեք տպենք տողեր այս երկու նախշերի միջև՝ օգտագործելով sed և awk հրամանները տարբեր կերպ:
Սեդի հրամանը
sed հրամանը տրամադրում է մի քանի տարբերակ՝ միայն ընտրված տողերում փոփոխություններ կամ փոփոխություններ կատարելու և փոփոխվող տողերը ընտրելու համար։ Ըստ խմբագրված սկրիպտի, այս հրամանը փոփոխում է նշված ֆայլի պարամետրի տողերը և ցուցադրում դրանք որպես ելք:
Պայման 1. Տպել տողերը՝ բացառելով երկու նախշերը
Քանի որ sed հրամանը չի աջակցում տրամաբանական օպերատորներին, դուք չեք կարող կատարել վերը նշված պայմանը՝ միացնելով օրինաչափությունները և AND օպերատորը։ Այնուամենայնիվ, մենք կարող ենք դա անել՝ AND օպերատորի փոխարեն երկու ստուգում տեղադրելով:
sed -n '/pattern 1/, /pattern 2/{ /pattern 1/! { /pattern 2/! p } }' <filename>
Ծանոթագրություն − Ինչպես տեսնում եք, վերը նշված բոլոր պայմաններում մենք օգտագործել ենք «-n» և «p» տարբերակները, ինչը նշանակում է.
-n − Նախշերի տարածությունը տպելը կանխելու համար:
p - Արդյունքը վերահսկելու համար:
Օրինակ, եկեք բացառենք «Information Start» և «Information End»՝ օրինակ.txt ֆայլի մնացած տեղեկատվությունը տպելու համար.
sed -n '/Information Start/, /'Information End/{ /Professional Details/! { /'Personal Details/! p } }' example.txt
Information Start
Professional Details:
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint
Information End
Information Start
Personal Details:
Address: House No. XX Street 254/76
Age: 26 Years
Information End
Վիճակ 2. Տպել տողերը՝ ներառյալ միայն մեկ նախշը
Դուք կարող եք հեռացնել օրինաչափությանը համապատասխանող տողերը՝ հերթական անգամ ստուգելով հասցեների տիրույթում գտնվող տողերը: Հրամանը նման կլինի −
sed -n '/pattern 1/, /pattern 2/{ /pattern 2/!p }' <filename>
Այս վիճակում մենք պետք է պահպանենք միայն մի նախշը, իսկ մյուսը հանենք կամ ճնշենք։ Մենք կտպենք վերը նշված ֆայլի տողերը «Information Start» օրինաչափության միջև՝ հեռացնելով «Information End» նախշը:
sed -n '/Information Start/, /Information End/{ /Information Start/!p }' example.txt
Professional Details:
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint
Personal Details:
Address: House No. XX Street 254/76
Age: 26 Years
Վիճակ 3. Տպել տողերը երկու նախշերի միջև
Ֆայլում երկու նախշերը ներառելը և նրանց միջև գծերը տպելը հեշտ է: Այսպիսով, դա անելու համար օգտագործեք հետևյալ sed հրամանը -
sed -n '/pattern 1/, /pattern 2/p' <filename>
Այստեղ մենք ներառում ենք և՛ օրինակը՝ «Տեղեկատվության սկիզբ» և «Անձնական տվյալներ»՝ օգտագործելով հետևյալ հրամանը.
sed -n '/Information Start/, /Information End/p' example.txt
Information Start
Professional Details:
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint
Information End
Information Start
Personal Details:
Address: House No. XX Street 254/76
Age: 26 Years
Information End
Awk հրամանը
Awk հրամանը կատարյալ այլընտրանք է sed հրամանին, երբ ձեր պահանջները բարդ են: Այս հրամանն ունի տարբեր ընտրանքներ՝ զտելու օրինաչափությունների մշակման և սկանավորման արդյունքները: Դուք կարող եք փոխարինել և որոնել տեսակներն ու տեքստերը, ինդեքսավորել տվյալների բազան և վավերացնել sed հրամանով, քանի որ այն ապահովում է տվյալների լավ վերահսկում:
Վիճակ 1. Տպել տողերը երկու նախշերի միջև
Ինչպես sed հրամանը, դուք կարող եք տպել տողերը երկու նախշերի միջև՝ օգտագործելով awk հրամանը: Դա անելու համար օգտագործեք հետևյալ հրամանը −
awk '/pattern 1/, /pattern 2/' <filename>
Օգտագործելով awk հրամանը այստեղ, մենք ներառում ենք երկու օրինաչափություններ (Տեղեկատվության սկիզբ, տեղեկատվական ավարտ) հետևյալ կերպ.
awk '/Information Start/, /Information End/' example.txt
Information Start
Professional Details:
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint
Information End
Information Start
Personal Details:
Address: House No. XX Street 254/76
Age: 26 Years
Information End
Եթե ձեր փոփոխականն ունի ոչ զրոյական արժեք, այս հրամանը նույնպես գնահատում է այս փոփոխականը որպես True: Այսպիսով, դուք կարող եք նաև փոփոխական հայտարարել՝ տպագրությունն անջատելու կամ միացնելու համար տարբեր պայմաններում հետևյալ կերպ −
awk '/pattern 1/{ f = 1 } f; /pattern 2/{ f = 0 }' <filename>
Օրինակ, մենք հայտարարում ենք փոփոխականը երկու օրինաչափությունների մեջ ներառելու համար՝ օգտագործելով հետևյալ հրամանը −
awk '/Information Start/{ f = 1 } f; /Information End/{ f = 0 }' example.txt
Information Start
Professional Details:
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint
Information End
Information Start
Personal Details:
Address: House No. XX Street 254/76
Age: 26 Years
Information End
Շրջանակի օրինաչափությունն օգտագործելու փոխարեն՝ մենք վերը նշված հրամանում հայտարարագրել ենք «f» փոփոխականը՝ որպես անջատիչ awk տպիչի համար:
Երբ 1-ին նախշը համընկնում է, մենք միացնում ենք այն և տպում նրա միջակայքը «f»-ով:
Երբ f-ը միացված է, այն տպում է բոլոր տողերը, մինչև հասնի օրինակ 2-ին:
Մինչև օրինաչափությունը 2, f-ի արժեքը պահպանվում է որպես 1, քանի որ այն նույնպես պետք է տպվի, և գալուց հետո մենք անջատում ենք անջատիչը՝ f-ի արժեքը դնելով 0-ի։
Այսպիսով, դուք կարող եք օգտագործել «տպիչի անջատիչը»՝ խնդիրը լուծելու այլ սցենարներում:
Պայման 2. Տպել տողերը՝ բացառելով երկու նախշերը
Օգտագործեք հետևյալ հրամանը՝ ելքի տակից երկու օրինաչափությունները հեռացնելու համար
awk '/pattern 1/{ f = 1; next } /pattern 2/{ f = 0 } f' <filename>
Այս հրամանը բարդ է, քանի որ երբ 1-ին օրինակը սկսվում է, ելքը պետք է միացվի, և դրանից անմիջապես հետո կատարվում է հետևյալ գործողությունը { f=1; հաջորդ }. Որտեղ մենք դադարեցնում ենք ընթացիկ տողի մշակումը և մուտքագրումից կարդում ենք հաջորդ տողը: Այսպիսով, անջատիչը միացված է, բայց օրինակ 1-ը չի տպվում: Մենք բացառում ենք երկու օրինաչափությունները՝ գործարկելով ստորև նշված awk հրամանը −
awk '/Information Start/{ f = 1; next } /Information End/{ f = 0 } f' example.txt
Information Start
Professional Details:
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint
Information End
Information Start
Personal Details:
Address: House No. XX Street 254/76
Age: 26 Years
Information End
Վիճակ 3. Տպել տողերը, ներառյալ միայն օրինակ 2-ը
Եթե f-ը դրված է նախշ 1-ից առաջ, ապա 1-ին օրինակի տողերը չեն տպագրվում ելքում:
awk 'f; /pattern 1/{ f = 1 } /pattern 2/{ f = 0 }' <filename>
Awk-ում փոփոխական օգտագործելիս դրա արժեքը կլինի 0 կամ դատարկ տողը, եթե այն նախկինում նշանակված կամ հայտարարված չէ: Բացի այդ, փոփոխականը միայն կգնահատվի որպես կեղծ, այնպես որ տպման լռելյայն համակարգը չի գործարկվի:
Այստեղ մենք տպում ենք միայն «Information End» նախշի միջև եղած տողերը: Դրա համար մենք օգտագործում ենք հետևյալ հրամանը −
awk 'f; /Information Start/{ f = 1 } /Information End/{ f = 0 }' example.txt
Professional Details:
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint
Information End
Personal Details:
Address: House No. XX Street 254/76
Age: 26 Years
Information End
Վիճակ 4. Տպել տողերը, ներառյալ միայն օրինակ 1-ը
Այս վիճակում մենք փոխել ենք հրամանը՝ ներառելով օրինակ 1, որը նման է −
awk '/pattern 1/{ f = 1 } /pattern 2/{ f = 0 } f' <filename>
Ինչպես տեսնում եք, վերը նշված հրամանում մենք փոխել ենք f-ի դիրքը։ Երբ F-ը տեղադրվում է վերջում, անջատիչը փակվում է հենց որ գալիս է օրինակ 2-ը: Այնուհետև ելքը տպվում է՝ ստուգելով անջատիչը, որպեսզի 2-րդ օրինակի տողերը չտպվեն։
Հետևաբար, մենք տպում ենք «Information Start» օրինակի միջև եղած տողերը միայն ստորև նշված awk հրամանի միջոցով
awk '/Information Start/{ f = 1 } /Information End/{ f = 0 } f' example.txt
Information Start
Professional Details:
Name: John Novik
Occupation: Technical Writer
Salary: 250K/Year
Company Name: Tutorialspoint
Information Start
Personal Details:
Address: House No. XX Street 254/76
Age: 26 Years
Պայման 5. Տպել տողեր գծերի հատուկ տիրույթի միջև
Օգտագործելով ստորև բերված awk հրամանը, դուք կարող եք սահմանել որոշակի տողերի շրջանակ և տպել միայն այդ տողերը:
awk 'NR==X, NR==Y' <filename>
Այստեղ X-ը կլինի տպագրական տողերի մեկնարկային տիրույթը, իսկ Y-ը կլինի վերջնական տիրույթը, և այն կտպագրի բոլոր տողերը այս տողերի միջև: Օրինակ, օրինակ.txt ֆայլից տպում ենք տողերը 5-րդ տողից մինչև տող 11:
awk 'NR==5, NR==11' example.txt
Information End
Information Start
Personal Details:
Address: House No. XX Street 254/76
Age: 26 Years
Information End
Եզրակացություն
Այս հոդվածում մենք բացատրել ենք, թե ինչպես տպել տողերը և տեքստը նախշերի միջև: Linux-ում դուք կարող եք տողեր տպել օրինաչափությունների միջև sed և awk հրամանների կոմունալ ծրագրերի միջոցով: Մենք նկարագրել ենք տարբեր օրինակներ և պայմաններ ֆայլից միայն կոնկրետ տողեր տպելու համար: Հիշեք, որ յուրաքանչյուր հրաման պետք է զգույշ օգտագործեք, հակառակ դեպքում ընտրված ֆայլից կստանաք ոչ պատշաճ տեղեկատվություն: