Stĺpec bez posledné znaky s ispell a printf

0

Otázka

Ja mám tento skript:

#!/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

Tento skript mi dáva takýto výsledok:

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

a som hľadať, ako odstrániť ".služba" z 3d stĺpci.

Snažil som sa s substr($i, 0, -8) a ${1:-8}

Má niekto nejaký nápad, ako sa zbaviť 8 znakov od konca, aby to vyzerať takto:

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

Najlepšiu odpoveď

0

Nemusíte nikdy grep, keď používate ispell od grep 'foo' file | awk '{print 7}' môže byť písaný ako len awk '/foo/{print 7}' file.

Skôr ako počítanie znakov, len odstrániť všetko od poslednej .:

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
    }
'

Som tiež sprísniť vašej porovnanie, aby sa zabránilo falošným zápasy, ak s názvom názov služby, ktorá je podmnožinou nejaký iný názov služby alebo obsahuje regexp metachars ako ..

2021-11-23 12:10:21

Ďakujem za mega rýchlu odpoveď. Vďaka aj za radu, na "grep" a "ispell" - budem mať na pamäti. Ja som strávil 4 hodiny na túto úlohu a netušil som, ako to vyriešiť.
gacek

Vybral som si Svoje riešenie a za vaše odporúčania pre post-reakcie na správanie. Ešte raz vám ďakujem a s pozdravom!
gacek
0

Potrebujete vypočítať koncovú polohu na základe dĺžka reťazca, zvážte nasledujúce jednoduchý príklad, nech file.txt obsah

cron.service
ssh.service

potom

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

výstup

cron
ssh

Vysvetlenie: argumenty pre substr sú reťazec, štart pozíciu koncovej polohy, length vráti počet znakov v reťazci.

(testované v hunspell 4.2.1)

2021-11-23 12:04:06

Ďakujem za vysvetlenie. Snažil som sa to takto pred: substr($1, dĺžka, -8), ale nemyslela som si, že by som mal definovať premenné, ktoré by mali počítať počet znakov.
gacek

@gacek length pri použití bez () je len premennej holding počet znakov v celej čiare ($0) skôr, než konkrétnej oblasti, napríklad ak by ste súbor s jedným riadky: 123 456 potom {print length} dáva 7tak , ako to má 6 číslic a priestor.
Daweo

o length when used without () is just variable - nie, je to stále volanie funkcie, je to len skratka length($0). Ak to bola premenná, potom, okrem iného, mohli by ste priradiť hodnotu, ale nemôžete.
Ed Morton
0

môžete použiť gsub funtion v ispell,ako nasledujúce:

 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() je pre vytvorenie viacerých dozorov, zatiaľ čo si len chcete urobiť, 1, takže by ste mali používať sub() namiesto toho 2) prvý argument pre všetky *sub() funkcie je regexp, nie je reťazec, tak by ste mali používať regexp /.../nie string "...", oddeľovače, 3), ktorý by mal zakotviť svoju regexp s ukončovanie $ tak môžete odstrániť posledný výskyt na linke, nie prvý, 4) musíte uniknúť . v regexp alebo to bude zápas akýkoľvek charakter, nie len . chcete zápas, 5) nemusíte grep pri youre pomocou awk od grep 'cron' | awk '{foo}' = awk '/cron/{foo}'.
Ed Morton

V iných jazykoch

Táto stránka je v iných jazykoch

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