Տպել տողեր երկու նախշերի միջև 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 հրամանների կոմունալ ծրագրերի միջոցով: Մենք նկարագրել ենք տարբեր օրինակներ և պայմաններ ֆայլից միայն կոնկրետ տողեր տպելու համար: Հիշեք, որ յուրաքանչյուր հրաման պետք է զգույշ օգտագործեք, հակառակ դեպքում ընտրված ֆայլից կստանաք ոչ պատշաճ տեղեկատվություն: