Bash: trumpiausias būdas gauti n

Tarkime, kad per darbo dieną pakartotinai susiduriate su tokia forma iš vienos komandos iš bash formos (mano atveju nuo svn st rodymo Rails darbiniame kataloge):

 ? changes.patch M app/models/superman.rb A app/models/superwoman.rb 

dirbti su komandos komandomis - šiuo atveju - failų pavadinimais - reikalinga tam tikra sintaksės analizė, kad antroji skiltis būtų naudojama kaip kito komandos įvestis.

Ką aš padariau, naudoju awk kad gautumėte antrąjį stulpelį. kai noriu ištrinti visus failus (o ne tipiškus usecase :), norėčiau:

 svn st | awk '{print $2}' | xargs rm 

Kaip aš rašau tai daug, natūralus klausimas yra: ar yra trumpesnis (taip šaltesnis) būdas tai padaryti bash?

Pastaba: iš esmės klausiu apvalkalo klausimo, nors mano konkretus pavyzdys yra mano svn darbo eigoje. Jei manote, kad darbo eiga yra kvaila ir siūlo alternatyvų metodą, tikriausiai nebalsuosiu už jus, bet kiti gali, nes čia kyla klausimas, kaip gauti n-ojo stulpelio produkciją per trumpiausią įmanomą būdą . Ačiū :)

112
06 сент. rinkinys Sv1 06 sept. 2011-09-06 09:13 '11 at 9:13 2011-09-06 09:13
@ 8 atsakymai

Galite naudoti cut kad pasiektumėte antrąjį lauką:

 cut -f2 

Redaguoti: Apgailestaujame, nesuprato, kad SVN savo produkcijoje nenaudoja skirtukų, todėl tai yra šiek tiek nenaudinga. Galite sukonfigūruoti cut išvestį, bet tai truputį trapi - veiks panašus į cut -c 10- , bet tiksli vertė priklausys nuo jūsų nustatymo.

Kitas variantas: sed 's/.\s\+//'

82
06 сент. atsakymas pateiktas porges 06 Sep. 2011-09-06 09:19 '11 at 9:19 2011-09-06 09:19

Jei norite padaryti tą patį, kaip:

 svn st | awk '{print $2}' | xargs rm 

naudojant tik „bash“, galite naudoti:

 svn st | while read ab; do rm "$b"; done 

Žinoma, jis nėra trumpesnis, tačiau jis yra šiek tiek efektyvesnis ir teisingai apdoroja jūsų failų vietas.

69
06 сент. atsakymas, kurį pateikė Rick Sladkey 2011-09-06 09:27 2011-11-09 09:27 09:27

Aš atsidūriau toje pačioje situacijoje ir galiausiai pridėjau šiuos slapyvardžius į .profile failą:

 alias c1="awk '{print \$1}'" alias c2="awk '{print \$2}'" alias c3="awk '{print \$3}'" alias c4="awk '{print \$4}'" alias c5="awk '{print \$5}'" alias c6="awk '{print \$6}'" alias c7="awk '{print \$7}'" alias c8="awk '{print \$8}'" alias c9="awk '{print \$9}'" 

Tai leidžia man rašyti tokius dalykus:

 svn st | c2 | xargs rm 
21
07 апр. atsakymas pateikiamas StackedCrooked 07 Apr. 2017-04-07 20:43 '17 at 8:43 pm 2017-04-07 20:43

Pabandykite zsh. Jis palaiko priesagos pseudonimą, todėl galite apibrėžti X savo .zshrc as

 alias -g X="| cut -d' ' -f2" 

tada galite padaryti:

 cat file X 

Galite pereiti dar vieną žingsnį ir apibrėžti jį antrame stulpelyje:

 alias -g X2="| cut -d' ' -f2" alias -g X1="| cut -d' ' -f1" alias -g X3="| cut -d' ' -f3" 

kuri išleis failo „failas“ n. Tai galite padaryti grep išėjimui arba mažesniam išėjimui. Tai labai patogus ir žudantis Zsh bruožas.

Jūs galite pereiti vienu žingsniu toliau ir apibrėžti D:

 alias -g D="|xargs rm" 

Dabar galite įvesti:

 cat file X1 D 

ištrinti visus failus, išvardytus pirmajame failo „failas“ stulpelyje.

Jei žinote, bash, zsh nėra didelis dalykas, išskyrus kai kurias naujas funkcijas.

Hth Chris

13
06 сент. Atsakymas pateikiamas Chris 06 Sep. 2011-09-06 09:21 '11 at 9:21 am 2011-09-06 09:21

Kadangi neatrodo, kad esate susipažinę su scenarijais, čia yra pavyzdys.

 #!/bin/sh # usage: svn st | x 2 | xargs rm col=$1 shift awk -v col="$col" '{print $col}' "${@--}" 

Jei išsaugosite jį ~/bin/x ir įsitikinsite, kad ~/bin yra jūsų PATH (dabar tai, ką jūs galite ir turėtumėte įdėti į savo .bashrc ), turite trumpiausią įmanomą komandą išgauti n stulpelį; x n.

Scenarijus turi atlikti teisingą klaidų tikrinimą ir užstatą, kai jis vadinamas ne skaitmeniniu argumentu arba neteisingu argumentų skaičiumi ir tt; tačiau šios pagrindinės versijos pratęsimas bus prieinamas 102 >

Galbūt norėsite išplėsti scenarijų, kad leistumėte skirtingus stulpelių skirtukus. Pagal nutylėjimą analizuojama įvestis į laukus laukuose; naudoti kitą ribotuvą, naudokite -F ':' , kur : yra naujas ribotuvas. Įdiegus šį scenarijų kaip galimybę, jis trunka ilgiau, todėl palieku jį skaitytojui.


Naudojimas

file :

 1 2 3 4 5 6 

Jūs galite perduoti jį per stdiną (naudodami nenaudingą cat kaip kažką naudingesnio vietos);

 $ cat file | sh script.sh 2 2 5 

Arba nurodykite jį kaip scenarijaus argumentą:

 $ sh script.sh 2 file 2 5 

Čia sh script.sh daro prielaidą, kad scenarijus įrašomas kaip script.sh dabartiniame kataloge; jei išsaugosite jį naudingesniu pavadinimu kažkur PATH ir pažymėsite kaip vykdomąjį, kaip nurodyta aukščiau pateiktose instrukcijose, vietoj naudokite naudingą vardą (o ne sh ).

6
06 сент. atsakymą pateikė tripleee 06 Sep. 2011-09-06 10:09 '11 at 10:09 2011-09-06 10:09

Atrodo, kad jau turite sprendimą. Kad supaprastintumėte užduotį, kodėl gi ne tik įdėti komandą į „bash“ scenarijų (su trumpu pavadinimu) ir tiesiog paleiskite ją, o ne įvesdami šią „ilgą“ komandą kiekvieną kartą?

4
06 сент. Atsakymas pateikiamas Tarek Fadel 06 sep. 2011-09-06 09:17 '11 at 9:17 2011-09-06 09:17

Jei jums patogu rankiniu būdu pasirinkti stulpelį, galite pasirinkti labai greitai, naudodami pasirinkimą :

 svn st | pick | xargs rm 

Tiesiog pereikite prie bet kurios antro stulpelio >c ir paspauskite enter

2
09 янв. Atsakymą pateikė Bernardo Rufino sausio 09 d 2016-01-09 07:33 '16 at 7:33 AM 2016-01-09 07:33

Atkreipkite dėmesį, kad failo kelias neturi būti antrojo stulpelio „svn“ išvesties stulpelyje. Pavyzdžiui, jei pakeisite failą ir pakeisite jo turtą, tai bus trečiasis stulpelis.

Žr. Galimus išvesties pavyzdžius:

 svn help st 

Išvesties pavyzdys:

  M wc/bar.c A + wc/qax.c 

Siūlau pjauti pirmus 8 simbolius:

 svn st | cut -c8- | while read FILE; do echo whatever with "$FILE"; done 

Jei norite būti 100% tikri ir elgtis su išgalvotais failų pavadinimais, kurių pabaigoje yra vieta, pvz., Reikia išanalizuoti xml išvestį:

 svn st --xml | grep -o 'path=".*"' | sed 's/^path="//; s/"$//' 

Žinoma, vietoj grep / sed galite naudoti tikrą XML analizatorių.

1
06 сент. Michał Šrajer atsakymas. 2011-09-06 16:44 '11, 16:44, 2011-09-06 16:44

Kiti klausimai apie „ žymes arba klausimo pateikimas