hello
adott egy lista:
http://pastebin.com/BQe0794y
amit ilyen formába kell átalakítanom:
------
shared-mime-info-0.70-6.el6.x86_64
sudo-1.8.6p3-15.el6.x86_64
sysstat-9.0.4-27.el6.x86_64
system-config-firewall-base-1.2.27-7.2.el6_6.x86_64
tar-2:1.23-11.0.1.el6.x86_64
tzdata-2014j-1.el6.x86_64
udev-147-2.57.0.2.el6.x86_64
util-linux-ng-2.17.2-12.18.0.1
-------
a használt tool pedig bash és sed. A gond az h úgy néz ki, mint ha valami belső buffer telítődne és nem a fork már nem bír többet.
a script pedig:
sed -e 's/\.x86_64\|.noarch/-/g' -e 's/[ ]\{1,\}//g' $file-$date-input| \
sed -e 's/public_ol6_latest/.x86_64/g' -e 's/uekpublic_ol6_UEK_latest/uek.x86_64/g' -e 's/el6ius/el6.x86_64/g' | \
sed -e :a -e N -e 's/el6\n/el6/g' | \
sed -e :a -e N -e 's/ent-data-\n/ent-data-/' > $file
a kimenet pedig:
....
....
device-mapper-libs-1.02.90-2.el6_6.1.x86_64
device-mapper-persistent-data-
0.3.2-1.el6.x86_64
dhclient-12:4.1.1-43.P1.0.1.el6_6.1.x86_64
....
xorg-x11-drv-ati-firmware-7.3.99-2.el6.x86_64
xz-4.999.9-0.5.beta.20091007git.el6
.x86_64
xz-libs-4.999.9-0.5.beta.20091007git.el6
.x86_64
xz-lzma-compat-4.999.9-0.5.beta.20091007git.el6
.x86_64
yum-3.2.29-60.0.1.el6.x86_64
és ez így nem jó. mindehol szépen betudja formázni és össze kapcsolja a sorokat de az utolsó két parancs az nem megy neki.
viszont ha külön ki greppelem ezeket a részeket, a scriptben lévő sed parancs tökéletesen beformázza a sorokat.
tudja valaki hogy mi lehet a baj és hogy lehet megoldni?
próbáltam már fáljba írni, sleepeltetni, cat-ni, de egyik sem segít. mindig ugyan az. mintha a bash child nem tudna több sed parancsot kezelni.
azért gondolom h bash és nem sed, mert amikor kiíratom fáljba akkor ott a sed-nek meg kéne állnia és törlődni a memóriából, majd később újrahívva ismét betöltődni. de javítsatok kérlek ha tévedek.
nos végülis is a script a következő lett:
date=$(date +%Y_%m_%d)
file=/root/list-of-updates
yum check-update > $file-$date
sed -i -e "1,2 d" $file-$date
version=`awk '{sub(/\.(x86_64|noarch)$/, ("-" $2 "&"), $1); print $1}' $file-$date |grep -v public|grep -E '^[0-9]'|awk -F'.el6' '{print $1}'`
awk '{sub(/\.(x86_64|noarch)$/, ("-" $2 "&"), $1); print $1}' $file-$date |grep -v public|grep -vE '^[0-9]'| sed -e "s/ent-data-/ent-data-$version/" > $file-$date-$$
cat $file-$date-$$
akit érdekel a fő probléma az volt h míg a 'yum check-update' kimenete sortörés nélküli mert kifér a képernyőre addig az átirányított kimenet már a default kőkorból megmaradt consol méreteket vette alapul ezért tördelte be a sorokat.
tudom, a két parancs kétszer parzolja végig a fájlt de mivel nem 100M beszélünk mind1 is.
- 4004 megtekintés
Hozzászólások
Szerintem rossz helyen keresgélsz. Egyrészt az ilyesmi szerintem egy awk scripttel egyszerűbb, de az sem világos, minek sok sed egy helyett. Pontosvesszővel elválasztva egy sed parancs képes több sed utasítást végrehajtani, pl.: sed 's/valami/akármi/; s/izé/bigyó/g'. Nekem a végén a regexben lévő \n a gyanús. Nem próbáltam ugyan ki, de sor végére illeszkedés szerintem inkább $, mint \n. Már, ha az akart lenni.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
a regexp-ben lehet valami de nem segít. kipróbáltam $ jellel de nem megy. egyébként a \n karakter jó lesz mert ahogy írtam ha rágreppelek és akkor futtatom a sed-t akkor megy.
a sok sed már kínomban van hogy jobban átlássam.
awk-hoz sajnos nem értek :(
--
A legértékesebb idő a pillanat amelyben élsz.
https://sites.google.com/site/jupiter2005ster/
- A hozzászóláshoz be kell jelentkezni
Pedig az awk tényleg kevesebb kerítésmintát kér:
awk '{sub(/\.(x86_64|noarch)$/, ("-" $2 "&"), $1); print $1}'
Illetve - hasonlóan a sedes megoldáshoz -, itt a "&" változhat ".x86_64"-gyé, ha minden az lesz, az eredeti architektúrától függetlenül..
- A hozzászóláshoz be kell jelentkezni
ez nagyon király, bele is vetem majd az awk-ba amint van időm de egy picit foghíjas:
device-mapper-persistent-data-.x86_64
0.3.2-1.el6
:(
--
A legértékesebb idő a pillanat amelyben élsz.
https://sites.google.com/site/jupiter2005ster/
- A hozzászóláshoz be kell jelentkezni
Próbáld meg úgy futtatni, hogy az awk helyett azt írod: gawk.
Ui. nálam ilyen jelenséget nem mutat.
- A hozzászóláshoz be kell jelentkezni
Próbáltam kitalálni, hogy a példakimeneted kicsit téves. Ha tényeg, akkor így:
sed -e 's/\([^[:space:]]*\)\(\.x86_64\|\.noarch\)[[:space:]]\+\([^[:space:]]*\)\(\.el6\(_6\)\?\).*/\1-\3\4\2/'
Ha tényleg x86_64-et akarsz a noarch helyett is, akkor a \2 helyére .x86_64 kerül.
- A hozzászóláshoz be kell jelentkezni
.........
device-mapper-persistent-data.x86_64
----------------------------0.3.2-1.el6 public_ol6_latest
dhclient-12:4.1.1-43.P1.0.1.el6_6.x86_64
dhcp-common-12:4.1.1-43.P1.0.1.el6_6.x86_64
dracut-004-356.0.1.el6.noarch
.........
udev-147-2.57.0.2.el6.x86_64
util-linux-ng-2.17.2-12.18.0.1.el6.x86_64
wget-1.12-5.el6_6.x86_64
xorg-x11-drv-ati-firmware-7.3.99-2.el6.noarch
xz-4.999.9-0.5.beta.20091007git.el6.x86_64
---------------------------- public_ol6_latest
xz-libs-4.999.9-0.5.beta.20091007git.el6.x86_64
---------------------------- public_ol6_latest
xz-lzma-compat-4.999.9-0.5.beta.20091007git.el6.x86_64
---------------------------- public_ol6_latest
yum-3.2.29-60.0.1.el6.noarch
yum-plugin-security-1.1.30-30.0.1.el6.noarch
yum-rhn-plugin-0.9.1-52.0.1.el6_6.noarch
......
ugyan az az eredmény. a te sed scripted azért nem jó mert van ahol noarch kell és van ahol meg x86_64.
továbbá van 1 sor ahol a forrás listában van egy sortörés. arra szintén nem jó ez a script.
valamint az UEK kernel sem kezeli jó:
a csomag név:-------kernel-uek-2.6.39-400.209.1.el6uek.x86_64
a script eredmény:--kernel-uek-2.6.39-400.246.2.el6.x86_64
de egyébként köszönöm, most megint tanultam vlami újat.
--
A legértékesebb idő a pillanat amelyben élsz.
https://sites.google.com/site/jupiter2005ster/
- A hozzászóláshoz be kell jelentkezni
Bizisten nem látom, hogy a bemenet melyik rekordjában van sortörés.
Az rád van bízva, hogy a noarch marad-e noarch vagy az is x86_64 lesz-e (utóbbit konkrétan a példakimenetetből vettem: system-config-firewall-base-1.2.27-7.2.el6_6.x86_64, pedig a bemenet noarch). Az első sed így, a második úgy alakít át.
De ez a sortörés érdekelne.
- A hozzászóláshoz be kell jelentkezni
device-mapper-libs.x86_64 1.02.90-2.el6_6.1 public_ol6_latest
device-mapper-persistent-data.x86_64
0.3.2-1.el6 public_ol6_latest
dhclient.x86_64 12:4.1.1-43.P1.0.1.el6_6.1 public_ol6_latest
dhcp-common.x86_64 12:4.1.1-43.P1.0.1.el6_6.1 public_ol6_latest
én így kapom az eredményt amikor cat-em vagy sed-el.
nem lehet környezeti gond, már mint a console méret???
--
A legértékesebb idő a pillanat amelyben élsz.
https://sites.google.com/site/jupiter2005ster/
- A hozzászóláshoz be kell jelentkezni
Ah, így világos:
awk 'NF < 3 {getline x; $0 = ($0 x)} ; {sub(/\.(x86_64|noarch)$/, "-" $2 "&", $1); print $1}'
- A hozzászóláshoz be kell jelentkezni
hohó, elmagyaráznád kérlek ezt a sort?
ez nekem most magas. A sub fügvény ha jólértem regexpre keres (/\.(x86_64|noarch)$/) - ez az 'r' betű a manuálból, aztán $1 t string, a "-" $2 "&" mi? Gondolom a "-" egy sima kötőjel, de a $2 és &?
a getline meg végkép sötét folt.
--
A legértékesebb idő a pillanat amelyben élsz.
https://sites.google.com/site/jupiter2005ster/
- A hozzászóláshoz be kell jelentkezni
A getline a meghívás helyén azonnal beolvassa a következő rekordot. Paraméter nélkül a $0-át teszi egyenlővé azzal, de ha kap egy változónevet paraméterként, akkor az adott változó lesz egyenlő a prompt beolvasott rekorddal. A getline végrehajtásával a fájlmutató és a NR/FNR változók ugyanúgy mozognak, mint az automatikus, "végtelen ciklusos" olvasáskor.
awk '
# Ha a mezők száma nem éri el a 3-at, beolvassuk x-be a következő sort*,
# és $0 értékének végére tesszük a pótlólag beolvasott részt.
# Azzal, hogy $0-nak értéket adunk, egyúttal kikényszerítjük, hogy
# az új $0 mezőkre törtdelése is megtörténjék.
# Ha eleve eléri a 3-at a mezők száma, akkor az a rész mintha itt sem volna.
NF < 3 { getline x; $0 = ($0 x) }
# Az első mezőben a mező végén álló architektúranevet
# (a megelőző ponttal együtt) lecseréljük az alábbi
# részekből konkatenált sztringre:
# 1: "-"
# 2: a 2. mező
# 3: az a sztring, amit architektúraként megtaláltunk a reguláris
# kifejezéssel (a.m.: ".x86_64" vagy ".noarch")
# Ezáltal az első mező értéke az lesz, amit látni szeretnénk,
# már csak ki kell írni.
{ sub(/\.(x86_64|noarch)$/, "-" $2 "&", $1); print $1 }'
* Azzal a feltételezéssel él, hogy egy getline-nal már mindenképpen meglesz a 3 mező. Minimális módodítással elérhető, hogy akkor is működjön a többi rész, ha soronként csak egy mezőt talál, vagy akár üres sort a szabályosnak tekintett, 3-mezős sorok mellett.
- A hozzászóláshoz be kell jelentkezni
köszönöm a magyarázatot. teljesen érthető. 2 kérdés még:
te hol ill. hogyan tanultad meg az awk ilyen szinten?
a másik:
a módosítás "Minimális módodítással elérhető, hogy akkor is működjön a többi rész, ha soronként csak egy mezőt talál, vagy akár üres sort a szabályosnak tekintett, 3-mezős sorok mellett"
az hogyan nézne ki?
próbáltam megírni de nem jutottam 1-ről a 2-re.
if NF <3 || NF <2 || NF < 1 || NF < 0 { getline x; $0 = ($0 x) }.....
de ez nem kezeli le ha több üres sor is van.
--
A legértékesebb idő a pillanat amelyben élsz.
https://sites.google.com/site/jupiter2005ster/
- A hozzászóláshoz be kell jelentkezni
if NF < 3 || NF < 2 || NF < 1 || NF < 0
Ez nem ugyanazt jelenti, mint az if NF < 3 feltétel?
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
1. Hajdan lefordítottam a man lapot, amivel picit jobban sikerült megemészteni, mint "csak" átolvasva.
2. Tkp. egy ciklus kell, ami addig olvas és konkatenál, amíg meg nem lesz a minimum 3 mező:
awk '{ while ( NF<3) { getline x; $0 = ($0 " " x)}; ...}'
(A ($0 x)-ből a biztonság kedvéért lett ($0 " " x): ha az n-edik sor nem fehér szóközzel végződik, és az n+1-edik nem azzal kezdődik, akkor az utolsó és első mező összetapad és az új $0-ban egy mezőként szerepel. Ezt nem akarjuk.)
- A hozzászóláshoz be kell jelentkezni