LINUX.ORG.RU

[awk] не работает почему-то...

 


0

0

хочу вывести на печать юзеров, у которых размер почтового файла в /var/spool/mail больше, нежели чем мег, т.е. длинна $5 более, чем 7 цифр, соответственно $5 это размер ящика в байтах. авк меня посылает:


[root@mail mail]# ls -la | awk '{if(length($5) > 7) print $5}'
*** glibc detected *** awk: double free or corruption (fasttop): 0x08fca8f8 ***
======= Backtrace: =========
/lib/libc.so.6[0x50af0d]
/lib/libc.so.6(cfree+0x90)[0x50e560]
awk(str2wstr+0x42)[0x80700d2]
awk(do_length+0xb5)[0x8058bb5]
awk(r_tree_eval+0x52e)[0x80824ce]
awk(r_tree_eval+0x7f)[0x808201f]
awk[0x8083596]
awk(interpret+0x96b)[0x8080e4b]
awk(interpret+0x1d6)[0x80806b6]
awk(do_input+0x38)[0x806d128]
awk(main+0x1063)[0x806f7a3]
/lib/libc.so.6(__libc_start_main+0xdc)[0x4baf2c]
awk[0x804c9a1]
======= Memory map: ========
0033d000-00348000 r-xp 00000000 fd:00 13041841 /lib/libgcc_s-4.1.1-20061011.so.1
00348000-00349000 rwxp 0000a000 fd:00 13041841 /lib/libgcc_s-4.1.1-20061011.so.1
00483000-0049c000 r-xp 00000000 fd:00 13043196 /lib/ld-2.5.so
0049c000-0049d000 r-xp 00018000 fd:00 13043196 /lib/ld-2.5.so
0049d000-0049e000 rwxp 00019000 fd:00 13043196 /lib/ld-2.5.so
004a5000-005dd000 r-xp 00000000 fd:00 13043197 /lib/libc-2.5.so
005dd000-005df000 r-xp 00137000 fd:00 13043197 /lib/libc-2.5.so
005df000-005e0000 rwxp 00139000 fd:00 13043197 /lib/libc-2.5.so
005e0000-005e3000 rwxp 005e0000 00:00 0
005e5000-0060a000 r-xp 00000000 fd:00 13043199 /lib/libm-2.5.so
0060a000-0060b000 r-xp 00024000 fd:00 13043199 /lib/libm-2.5.so
0060b000-0060c000 rwxp 00025000 fd:00 13043199 /lib/libm-2.5.so
0060e000-00610000 r-xp 00000000 fd:00 13043198 /lib/libdl-2.5.so
00610000-00611000 r-xp 00001000 fd:00 13043198 /lib/libdl-2.5.so
00611000-00612000 rwxp 00002000 fd:00 13043198 /lib/libdl-2.5.so
00bea000-00beb000 r-xp 00bea000 00:00 0 [vdso]
08047000-08095000 r-xp 00000000 fd:00 26181696 /bin/gawk
08095000-08096000 rw-p 0004d000 fd:00 26181696 /bin/gawk
08096000-0809b000 rw-p 08096000 00:00 0
08fca000-08feb000 rw-p 08fca000 00:00 0
b7c00000-b7c21000 rw-p b7c00000 00:00 0
b7c21000-b7d00000 ---p b7c21000 00:00 0
b7dc2000-b7fc2000 r--p 00000000 fd:00 5050978 /usr/lib/locale/locale-archive
b7fc2000-b7fc3000 rw-p b7fc2000 00:00 0
b7fca000-b7fd1000 r--s 00000000 fd:00 5144836 /usr/lib/gconv/gconv-modules.cache
b7fd1000-b7fd2000 rw-p b7fd1000 00:00 0
bf807000-bf81c000 rw-p bf807000 00:00 0 [stack]
Aborted
[root@mail mail]#

☆☆
Ответ на: комментарий от vilfred

>справился уже так: Ну если это считается ответом на вопрос, почему происходит "awk: double free or corruption", то можно принять и такой ответ:

find /var/spool/mail/ -size +10000000c -printf '%s\t%f\n'

Хотя, может надо было исходный скрипт поправить:

ls -la | awk '{if( NR >= 9 && length($5) > 7) print $5}'

mky ★★★★★
()

о! у меня совсем недавно гнушный awk тоже таким же образом крашился на очень простой программе. Хотя гораздо более сложные переваривал часами. Там похоже какая-то конструкция вызывает неправильную работу с памятью

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

наверное $5 это какойнить адрес в памяти, типа ссылки на адрес, где лежит значение переменной самой.

vilfred ☆☆
() автор топика

еще 5 копеек в общак :-)

cd /var/spool/mail
du -sk * | awk '$1 > 1024 {print $2}'

sdio ★★★★★
()

[c0der@rock ~other/info]$ ls -l | awk '{if(length($5) > 7) print $5}'                                     
13098159
[c0der@rock ~other/info]$ rpm -q gawk
gawk-3.1.5-alt3
[c0der@rock ~other/info]$ rpm -q --lastchange gawk
* Вск Дек 17 2006 Dmitry V. Levin <ldv at altlinux org> 3.1.5-alt3

- Updated to gawk-stable CVS snapshot 20061130, fixes multiple bugs.
- Applied suse fix for dfa generation of interval expressions
  in multibyte locales (suse#148453).
- Applied fix for length() return in multibyte locales (Paul Eggert),
  http://lists.gnu.org/archive/html/bug-gnu-utils/2005-11/msg00115.html
- Applied fix for memory leak in do_match (Sven Wegener),
  http://lists.gnu.org/archive/html/bug-gnu-utils/2006-11/msg00166.html
- Applied fix for invalid read and write bugs (Ralf Wildenhues),
  http://lists.gnu.org/archive/html/bug-gnu-utils/2006-12/msg00027.html
- Fixed str2wstr() invalid free in multibyte locales (#9785).
- Fixed do_match() invalid read in multibyte locales (#9785).
- Removed rh-wconcat patch, looks like obsoleted by applied multibyte fixes.

php-coder ★★★★★
()
Ответ на: комментарий от php-coder

> У меня локаль CP1251

Предатель.

anonymous
()
Ответ на: комментарий от dilmah

>ls -la | awk '(NR >= 5) && (length($5) > 7) { print $5 }'

С учетом того, что во втором посте этой темы автор решил использовать конструкцию: 'print $5"\t"$9', логичнее использовать NR >= 9.

P.S. А так, ИМХО, в awk добавили "проблеммных" мест. Старый awk хорошо преваривал исходный скрипт и без проверки NR, и еще в нем было можно делать 'NF=-1', а в последних, вроде бы, 'NF=-1' вызывает падение.

mky ★★★★★
()
Ответ на: комментарий от mky

> Старый awk хорошо преваривал исходный скрипт и без проверки NR

он и по стандарту должен это переваривать:

References to nonexistent fields (that is, fields after $NF), shall evaluate to the uninitialized value.

An uninitialized value shall have both a numeric value of zero and a string value of the empty string

> и еще в нем было можно делать 'NF=-1', а в последних, вроде бы, 'NF=-1' вызывает падение.

а вот про то что NF можно присваивать значения в стандарте ничего не написано. Можно присваивать $0= или поля $i=, тогда NF автоматом перевычислится, но присваивать NF= нельзя

dilmah ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.