yum search segítség (megoldva)

A problémám, hogy a yum search kimenetén nem látom, hogy melyik csomag telepített, és melyik nem. (az apt és ha jól rémlik a pacman is tudja)

A yum list availabe és yum list installed használata elég kényelmetlen és lassú. főleg sok találat esetén.

Keresgéltem a man oldalak között, de nem találtam semmi célrevezetőt.

Van valakinek ötlete?

Hozzászólások

Egy-egy csomagra szokott ez kelleni. Akkor kijelölöm a csomagnevet, clipboardra teszem, majd

rpm -q csomagnév

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Itt egy konkrét példa, így érthetőbb mi a problémám.

Mondjuk nem megfelőlen működik a va-api. Csomagkezelőben megnézném, hogy milyen csomagok vannak vele kapcsolatban felrakva, és milyen csomagok érhetők el a tárolóban. Csakhogy ehhez két külön parancs szükséges, mert a sima yum search kilistáz mindent, és nem jelöli meg, hogy melyik csomag van már telepítve. Így utólag kell szemmel összevetnem, hogy mi hiányzik.

Ráadásul ha nem tudom a csomag nevét, és keresnem kell a leírásban is, meg vagyok lőve, mert lehet kapok több száz sort, és mazsolázzam ki hogy akkor ez fent van, vagy nincs fent.

Ezzel szemben ha csak annyi történne, hogy a kimenetben vastagon, vagy más szinnel lenne szedve az installált csomag, minden problémám megoldódna.

Értem a problémád, mert már nekem is jól jött volna. Ha nagyon fáj, írj rá shell scriptet! Különben csak a gondolkodáshoz kell, ha valaminek az okát keresed, hiszen ha telepítésnél megadsz olyan csomagnevet, ami már fel van telepítve, abból nem lesz baj.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Nézd, mit csináltam Neked! Nagyon gány, így éjszaka erre tellett:

yum search all rpm | cut -d: -f1 | grep '^[A-Za-z0-9]' | sort |\ xargs rpm -q | sed 's/^/+ /; s/^+ package /  /; s/ is not installed//'

Itt az rpm nevű szövegre keresünk. Felsorolja a találatokat, + jelet tesz azok elé, amik már telepítve vannak.

Az egész egy sor lenne, de akkor az első sor végén lévő backslash nem kell.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Köszönöm!

Nem értek semmilyen script programozáshoz (sajnos) így ez nagy segítség volt.

Abban tudnál még segíteni, hogy hogyan lehetne ezt kényelmesen használni?

#!/bin/bash
read a
yum search all $a | cut -d: -f1 | grep '^[A-Za-z0-9]' | sort | xargs rpm -q | sed 's/^/+ /; s/^+ package / /; s/ is not installed//'

tőlem ennyire tellett, aliasoltam, így már egész jó, de az lenne a legjobb, ha egy entert se kellene ütnöm. Hogyan kérhetném be az $a változót, még a script futtatása előtt? (tehát a parancs mellé írva, ahogyan a "gyári" yum is teszi)

Azt ugyan nem írtad, hogy milyen rendszeren, de szerintem a következő megoldás univerzális lesz. Egyszerű, mint a faék...

yum list all > /rpmlista

CentOS 5.x-ön fájl tartalma kb így néz ki:

Installed Packages
MAKEDEV.i386                               3.23-1.2                    installed
SysVinit.i386                              2.86-17.el5                 installed
acl.i386                                   2.2.39-8.el5                installed
[...]
Available Packages         
2hash.i386                                 0.2-1.el5.rf                rpmforge
389-admin.i386                             1.1.29-1.el5                epel
389-admin-console.noarch                   1.1.8-1.el5                 epel
389-admin-console-doc.noarch               1.1.8-1.el5                 epel
[...]

CentOS 6.x-on így néz ki néhány sor:

Installed Packages
ConsoleKit.x86_64                        0.4.1-3.el6                    @anaconda-CentOS-201207061011.x86_64/6.3
ConsoleKit-libs.x86_64                   0.4.1-3.el6                    @anaconda-CentOS-201207061011.x86_64/6.3
GeoIP.x86_64                             1.4.8-1.el6                    @epel
MAKEDEV.x86_64                           3.24-6.el6                     @anaconda-CentOS-201207061011.x86_64/6.3
MySQL-python.x86_64                      1.2.3-0.3.c1.1.el6             @base
[...]
Available Packages
2hash.x86_64                             0.2-1.el6.rf                   rpmforge
2ping.noarch                             2.0-2.el6                      epel
389-admin.i686                           1.1.35-1.el6                   epel
389-admin.x86_64                         1.1.35-1.el6                   epel
[...]

A fentiekből látszik, hogy ezen

/rpmlista

fájl tartalma már könnyebben feldolgozható.

---
Lehet, hogy kívül szőke vagyok, de belül sötét, oké?!

Tessék, már színes:

#!/bin/bash

yum search "$@" | cut -d: -f1 | grep '^[A-Za-z0-9].*\.' | sort | xargs rpm -q |\
    sed '
        s/.*/: & -/
        s/^: package //
        s/ is not installed -//
        s/^: /\\x1b[33;1m/
        s/ -$/\\x1b[m/
        s/.*/'$"'&'"'/' | xargs -n1 echo -e
exit 0

Héjprogramozás nem nehéz, barátkozz vele! ;)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Köszönöm mindenkinek, segítettetek maradéktalanul megoldani a gondomat, és rámutattatok milyen irányba lenne érdemes továbbképeznem magamat :) (shell programozás)

A scriptet yumsearch névvel illettem, s ugyanúgy, mint eddig, az első paraméter lehet az all kulcsszó, de el is hagyhatod igény szerint. A kimenetben félkövér sárga, ami már fel van telepítve, sima szövegszínű, ami nincs.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Írtam neked egy olyan változatot is, amely megtartja a yum kimenetében a rövid csomagleírásokat:

#!/bin/bash

while read; do
    package="`awk 'BEGIN {FS=\" *:\"} /^[0-9A-Za-z].*\./ {print \$1}' <<<\"$REPLY\"`"
    if [ ! -z "$package" ] && rpm --quiet -q "$package"; then
        echo -e "${REPLY/$package/\\x1b[33;1m$package\\x1b[m}"
    else
        echo "$REPLY"
    fi
done < <(yum search "$@")
exit 0

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

köszi. mondjuk ha ennyire mélyen bele akarok menni, akkor általában már nyitok valamilyen grafikus csomagkezelőt, már ha van.

Közben pont kellett ez egy másik debianos gépen, és kiderült hogy ezt a funkciót az apt még sem tudja :) Legalábbis a stable debian nem. De valahol láttam, az biztos.

Most írom tiszta awk scriptre az egészet. Annyi a változás, hogy a csomagok rendezetten jelennek meg, ott lesz a rövid leírás hozzájuk, a telepített sárga, a nem telepített fehér. Tulajdonképpen készen vagyok, csak még töprengek valamin. Ha meglesz, bemásolom ide.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

érdemes lenne a scriptednek valamilyen nagyobb porondot keríteni, mint a hup egy eldugott fóruma, mert nem hiszem hogy ez az igény csak kettőnknél merült fel :)
Sok mindenkinek jól jöhetne.

Azt hogy hova lenne érdemes posztolnod, nem tudom. magyar részről sysadmin.hu halott, a hu.fedoracommunity.org 403-at dob, más magyar red hat-kapcsolatú oldalról meg nem tudok.
Esetleg feldobhatnád a planet.fedoraproject.org-ra. Már ha akarod. Én betettem hasznos dolgokat tartalmazó ládikámba. :)

akár, de ehhez már végképp nem értek.

Laikusként azt mondanám hogy minimum egy beolvasztásra kész patchet kellene küldeni a yum kartbanartó(i)nak, hogy érdemben foglalkozzon a kérdéssel. Aztán ha el is készül, az új feature eltűnik egy unalmas changelogban. És senki nem fog tudni róla, még ha szüksége is lenne rá (feltételezem hogy alapértelmezetten kikapcsolva marad)

Na, tessék, az awk-s változat, amelyben megmaradnak a leírások, és betűrendben rendezetten listáz:

#!/bin/awk -f

BEGIN {
    if (ARGC < 2) {
        print("Missing parameter") >"/dev/stderr";
        exit(1);
    }
    installed = "33";
    regexp = "^[[:alnum:]].*\\.";
    FS = " *:";
    cmd = "yum search"
    for (i = 1; i < ARGC; i++) cmd = cmd " " ARGV[i];
    orig_rs = RS;
    RS = "";
    cmd | getline;
    p = 1;
    len = split($0, list, "\n");
    for (l = 1; l <= len; l++) {
        split(list[l], ln);
        if (ln[1] ~ regexp) packages[p++] = ln[1];
    }
    RS = orig_rs;
    p = asort(packages);
    for (i = 1; i <= p; i++) {
        package = packages[i];
        found = 0;
        color = system("rpm --quiet -q " package) ? "" : installed ";";
        for (j = 1; j <= length(list); j++) {
            line = list[j];
            split(line, ln);
            if (ln[1] == package) {
                found = 1;
                printf("\x1b[%s1m%s\x1b[m%s\n", color, package, substr(line, length(package)+1));
                continue;
            }
            if (found) {
                if (line ~ regexp) break;
                print(line);
            }
        }
    }
}

Az a sor, amelyben a printf() van, csak itt a hozzászólásban törik új sorba - akinél nem fér ki -, valójában nem.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

A yum magában miért nem volt jó?
Pl. ha így keresel:

yum list installed *string*

kilistáz minden telepített csomagot amiben szerepel a "string"

Ha pedig ezt használod:

yum list available *string*

Akkor kilistáz mindent amiben szerepel a "string", de azokat a talalálatokat, amik telepítve vannak, megjelöli más szinnel.

-Mr-

A yum magában miért nem volt jó?

Mert nem ez volt a feladat. Amit írsz, arra az rpm -qa \*substring\* alakot szoktam használni.

A yum search illetve yum search all akkor jó, ha nem tudod, mit keresel, csak sejtésed van róla. Az utóbbi a csomagleírásokban is keres. Lesz egy rakás találat, de jó volna látni, ezek közül mi van telepítve, s mi nincs.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE