คอลัมน์โดยสุดท้ายกับตัวอักษรภาษาโปรแกรม awklanguage section และ printf

0

คำถาม

ฉันมีสคริปต์:

#!/bin/bash

f_status () {
        systemctl list-units | grep $1 | awk '{ printf("SERVICE STATUS:  %-25s \t %s \t %s \t %s\n",$1,$2,$3,$4) }'
}

f_line() {
        echo "-------------------------------------------------------------------------------------------"
}

echo ""
f_line
f_status "cron"
f_status "ssh"
f_line

สคริปต์นี้ทำให้ผมช่างเป็นผลมาจากการพยากรณ์:

-------------------------------------------------------------------------------------------
SERVICE STATUS:  cron.service                    loaded          active          running
SERVICE STATUS:  ssh.service                     loaded          active          running
-------------------------------------------------------------------------------------------

และฉันค้นหาว่าต้องลบ".บริการ"จาก 3 มิติคอลัมน์

ฉันพยายามกับ substr($ฉัน,0,-8)และ${1:-8}

ใครมีความคิดวิธีที่จะกำจัด 8 ตัวอักษรจากที่สุดเพื่อทำให้มันดูเหมือนนี้:

-----------------------------------------------------------------------------------
SERVICE STATUS:  cron                    loaded          active          running
SERVICE STATUS:  ssh                     loaded          active          running
-----------------------------------------------------------------------------------
awk bash printf
2021-11-23 11:39:15
3

คำตอบที่ดีที่สุด

0

คุณไม่ต้อง grep ตอนที่คุณกำลังใช้ภาษาโปรแกรม awklanguage section ตั้งแต่ grep 'foo' file | awk '{print 7}' สามารถถูกเขียนเป็นแค่ awk '/foo/{print 7}' file.

มากกว่าหวังตัวอักษรแค่เอาทุกอย่างเริ่มจากสุดท้าย .:

systemctl list-units |
awk -v tgt="$1" '
    {
        svc = $1
        sub(/\.[^.]*$/,"",svc)
    }
    svc == tgt {
        printf "SERVICE STATUS:  %-25s \t %s \t %s \t %s\n",svc,$2,$3,$4
    }
'

ฉันยัง tightened ของคุณเปรียบเทียบเพื่อหลีกเลี่ยงปลอมตรงกับถ้าเรียกว่าบริการชื่อของมันเป็น subset ของคนอื่นบริการชื่อหรือมี regexp metachars เหมือน ..

2021-11-23 12:10:21

ขอบคุณสำหรับ mega เร็วคำตอบ ขอบคุณยังสำหรับคำแนะนำ"grep"และ"ภาษาโปรแกรม awklanguage section"-ฉันจะเก็บมันไว้ในใจแล้ว ฉันใช้เวลา 4 ชั่วโมงบนงานนี้และฉันไม่รู้จะแก้ไขมัน
gacek

ฉันเลือกทางแก้ของคุณและทำตามคำแนะนำของฉันแน่นอนดสำหรับการตอบสนพฤติกรรม ขอบคุณอีกครั้งและที่ดีที่สุดที่ฝากฝัง!
gacek
0

คุณต้องสะทกสะทานเลยละสิสิ้นสุดตำแหน่งจากความยาวข้อความ,พิจารณาตามง่ายกตัวอย่างเช่นปล่อย file.txt เนื้อหาถูก

cron.service
ssh.service

แล้ว

awk '{print substr($1,1,length($1)-8)}' file.txt

ส่งออก

cron
ssh

คำอธิบาย:มีอาร์กิวเมนต์สำหรับ substr เป็นข้อความเริ่มตำแหน่งจุดจบตำแหน่ง length กลับจำนวนของตัวอักษรในข้อความ

(ทดสอบใน gawk 4.2.1)

2021-11-23 12:04:06

ขอบคุณสำหรับคำอธิบาย ฉันพยายามทางนี้ก่อนที่:substr($1,ความยาว,-8)แต่ฉันไม่คิดว่าฉันควรจะกำหนดตัวแปรที่ควรจะนับจำนวนของตัวอักษร
gacek

@gacek length ตอนที่เคยโดยไม่ได้ () เป็นแค่ตัวแปรถือจำนวนของตัวอักษรในทั้งหมด($0)มากกว่าพิเศษสนามสำหรับตัวอย่างเช่นถ้าคุณมีแฟ้มเดียวกับบรรทัด: 123 456 แล้ว {print length} ให้ 7อย่างที่มันมี 6 ตัวเลขและอวกาศ
Daweo

เกี่ยวกับ length when used without () is just variable -ไม่มันยังคงเป็นฟังก์ชันเรียกมันเป็นแค่ช่วยย่อมันให้ length($0). ถ้ามันเป็นตัวแปรนั้นรวมสิ่งประกอบอื่นๆคุณอาจจะกำหนดเป็นค่ากับมันแต่นายทำไม่ได้
Ed Morton
0

คุณสามารถใช้ gsub funtion ในภาษาโปรแกรม awklanguage section เหมือนต่อไปนี้:

 systemctl list-units | grep 'cron' | awk '{gsub(".service","",$1); printf("SERVICE STATUS:  %-25s \t %s \t %s \t %s\n",$1, $2 ,$3,$4) }'
SERVICE STATUS:  crond                       loaded      active      running
2021-11-23 12:04:26

1) gsub() คือที่ทำให้หลาย substitutions ในขณะที่คุณแค่ต้องการที่จะทำอย่าง 1 ดังนั้นคุณควรจะใช้ sub() แทนที่ 2)แรกเถียงกันสำหรับใดๆของ *sub() ฟังก์ชันเป็น regexp ไม่ใช่ข้อความดังนั้นคุณควรจะใช้ regexp /.../ไม่ใช่ข้อความ "...",delimiters,3)คุณควรสุดยอดของคุณกับ regexp terminating $ ดังนั้นคุณลบสุดท้ายที่เกิดบนแขวนอยู่บนเส้นด้าไม่ใช่คนแรก,4)คุณต้องการหนีออกจากที่ . ใน regexp หรือมันจะตรงกันอักขระใดๆไม่ใช่แค่ที่ . คุณต้องการเพื่อตรงกัน 5)คุณคงไม่ต้องการ grep ตอนที่คุณเป็นพวกผู้ดีใช้ awk ตั้งแต่ grep 'cron' | awk '{foo}' = awk '/cron/{foo}'.
Ed Morton

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่