Portál AbcLinuxu, 12. května 2025 07:26

Dotaz: Podivné chování getline v awk skriptu

21.10.2021 17:52 Tomáš Pelc | skóre: 22 | blog: multimedialni_pc_k_LCD_TV
Podivné chování getline v awk skriptu
Přečteno: 385×
Odpovědět | Admin
Parsuji výstup ldapsearch z AD a narazil jsem na zvláštní chování getline v awk skriptu. Nedokážu přijít na to, proč druhý výskyt jména "Lukaš" (ano, je tam krátké "a") se nevytiskne:
echo -e "givenName:: THVrYcWh\ngivenName:: VG9tw6HFoQo=\ngivenName:: THVrYcWh\ngivenName: Karel" | awk '{ v = "" } { if ($1 ~ "::") { "echo "$2" | base64 -d" | getline v; gsub (/::/, ":", $1); print $1, v } else { print $0 }}'
givenName: Lukaš
givenName: Tomáš
givenName: 
givenName: Karel
Máte někdo nějaké vysvětlení?

Jak upravit skript, aby fungoval i v takovém případě podle očekávání?

Díky

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

21.10.2021 18:46 Peter Golis | skóre: 64 | blog: Bežné záležitosti | Bratislava
Rozbalit Rozbalit vše Re: Podivné chování getline v awk skriptu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nebolo by lepšie ten ldapsearch urobiť v nejakom high level jazyku, napr pytóne ktorý má priamo knižnicu na LDAP čo rovno aj dekóduje ten base64 na text s diakritikou?
22.10.2021 07:24 Tomáš Pelc | skóre: 22 | blog: multimedialni_pc_k_LCD_TV
Rozbalit Rozbalit vše Re: Podivné chování getline v awk skriptu
Chápu, co navrhuješ, ale celkové zadání je takové: bude to součástí jenkins jobu a chceme to zachovat "as much simple as possible", takže využívat pouze již instalované core nástroje. Druhá věc je, že awk je mi prostě v této situaci sympatičtější a tak bych tomu chtěl mimo jiné přijít "na kloub".
22.10.2021 08:35 Peter Golis | skóre: 64 | blog: Bežné záležitosti | Bratislava
Rozbalit Rozbalit vše Re: Podivné chování getline v awk skriptu
Tiež mám podobný názor na pytón. Ale ak sa ten ldapsearch s Jerkinsom nedá použiť, tak veľa zdaru. Z toho pytónu lezie lepší výstup ktorý nie je treba takto ošetrovať. Ldapsearch trošku zaspal dobu.
Řešení 1× (Вherzet)
21.10.2021 21:18 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: Podivné chování getline v awk skriptu
Odpovědět | | Sbalit | Link | Blokovat | Admin
echo -e "givenName:: THVrYcWh\ngivenName:: VG9tw6HFoQo=\ngivenName:: THVrYcWh\ngivenName: Karel"|while read line; do items=(`echo $line`); define=${items[0]}; if [ "${define:10:1}" = ":" ]; then echo "${define:0:10} `echo ${items[1]}|base64 -d`"; else echo $line; fi; done
debian.plus@protonmail.com
22.10.2021 07:43 Tomáš Pelc | skóre: 22 | blog: multimedialni_pc_k_LCD_TV
Rozbalit Rozbalit vše Re: Podivné chování getline v awk skriptu
Díky za řešení.

Neuvedl jsem původně, že klíč (givenName:) není jediný, u kterého řeším base64 dekódování, takže skript by potřeboval úpravu. Nicméně ještě jednou díky za pomoc.
Řešení 1× (Вherzet)
22.10.2021 09:48 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: Podivné chování getline v awk skriptu
Verzia na študovanie:
keys="givenExtra givenName";
echo -e "givenExtra:: THVrYcWh\ngivenName:: VG9tw6HFoQo=\ngivenName:: THVrYcWh\ngivenName: Karel"|
while read line; do
	items=(`echo $line`);
	define=${items[0]};
	
	for key in $keys;
	do
		if [ "$define" = "$key::" ]; then
			echo "$key: `echo ${items[1]}|base64 -d`";
			break;
		fi
		if [ "$define" = "$key:" ]; then
			echo $line;
			break;
		fi;
	done;
done
Jednoriadková verzia: keys="givenExtra givenName"; echo -e "givenExtra:: THVrYcWh\ngivenName:: VG9tw6HFoQo=\ngivenName:: THVrYcWh\ngivenName: Karel"| while read line; do items=(`echo $line`); define=${items[0]}; for key in $keys; do if [ "$define" = "$key::" ]; then echo "$key: `echo ${items[1]}|base64 -d`"; break; fi if [ "$define" = "$key:" ]; then echo $line; break; fi; done; done
debian.plus@protonmail.com
Řešení 1× (Gréta)
22.10.2021 00:00 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Podivné chování getline v awk skriptu
Odpovědět | | Sbalit | Link | Blokovat | Admin

S awk:

echo -e 'givenName:: THVrYcWh\ngivenName:: VG9tw6HFoQo=\ngivenName:: THVrYcWh\ngivenName: Karel' \
| awk 'BEGIN {  FS = "(\\s|:)+"
               OFS = ": "
               b64 = "base64 -d" }
       /^givenName::/ { print $2 |& b64
                        close(b64, "to")
                        b64 |& getline $2
                        close(b64) }
       1'

Bez awk:

echo -e 'givenName:: THVrYcWh\ngivenName:: VG9tw6HFoQo=\ngivenName:: THVrYcWh\ngivenName: Karel' \
| while read gn name; do
    [[ "$gn" = *'::' ]] &&
    echo "${gn::-1}" "$(base64 -d <<< "$name")" ||
    echo "$gn" "$name"
  done
22.10.2021 07:37 Tomáš Pelc | skóre: 22 | blog: multimedialni_pc_k_LCD_TV
Rozbalit Rozbalit vše Re: Podivné chování getline v awk skriptu
@Andrej - díky za obě řešení.

Z mého úvodního dotazu nevyplynulo, že "givenName:" resp. "givenName::" není jediný klíč, u kterého řeším base64. Ty klíče tam jsou nejméně tři (ještě např. "dn:" a "sn:"). To už zkusím tvůj skript při-ohnout sám :-)

Dokázal bys mi objasnit, proč to moje původní řešení funguje tak nederministicky? Proč se proměnná "v" v případě druhého výskytu jména nenaplní správně, ale zůstane prázdná?
22.10.2021 09:14 X
Rozbalit Rozbalit vše Re: Podivné chování getline v awk skriptu
Mimochodem, kdyz nakopiruji tvoje reseni do terminalu dotanu:
/bin/sh: 1: Syntax error: "|" unexpected
Takze zrovna prenositelne to moc neni..
Řešení 1× (Вherzet)
22.10.2021 09:27 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: Podivné chování getline v awk skriptu
BASH != SH
debian.plus@protonmail.com
22.10.2021 14:01 Peter Golis | skóre: 64 | blog: Bežné záležitosti | Bratislava
Rozbalit Rozbalit vše Re: Podivné chování getline v awk skriptu
To je v poho. Človek za chvíľu zistí že nie všetky záznamy z ldapsearch sú v UTF, a posunie sa na druhú úroveň zbytočného riešenia.

Good luck :-)
22.10.2021 17:18 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Podivné chování getline v awk skriptu

Asi to špatně kopíruješ nebo máš špatný shell nebo obojí. Problém s řádkem začínajícím | jistě není tak těžké vyřešit.

22.10.2021 17:20 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Podivné chování getline v awk skriptu

Druhé řešení (Bash) na givenName nezáleží.

První rešení (AWK) se dá snadno přiohnout, aby se klíč zachoval.

Řešení 1× (Tomáš Pelc (tazatel))
25.10.2021 15:17 Tomáš Pelc | skóre: 22 | blog: multimedialni_pc_k_LCD_TV
Rozbalit Rozbalit vše Re: Podivné chování getline v awk skriptu
Tak jsem se snažil přiohnout tvoje AWK řešení a tady je výsledek:
ADST="givenName:: THVrYcWh\ngivenName:: VG9tw6HFoQo=\ngivenName:: THVrYcWh\nsn:: VG9tw6HFoQo=\ngivenName: Karel\nsAMAccountName:: xIxlc8WlbcOtxZkK"

echo -e "$ADST" \
  | awk 'BEGIN { FS = ": "; OFS = ": "; b64 = "base64 -d" }
  { if ($1 ~ ":") { print $2 |& b64; close(b64, "to"); b64 |& getline $2; close(b64) }}
  { gsub (/:/, "", $1); print $1, $2 }'
Předpokládám, že by to šlo vyřešit ještě elegantněji, ale na to už nestačí moje současné znalosti AWKu.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.