awk help needed
Jamon Camisso
jamon.camisso-H217xnMUJC0sA/PxXw9srA at public.gmane.org
Sun Jul 19 20:35:58 UTC 2009
Chris F.A. Johnson wrote:
> On Sun, 19 Jul 2009, Jamon Camisso wrote:
>
>> Chris F.A. Johnson wrote:
>>> On Sun, 19 Jul 2009, Jamon Camisso wrote:
>>>
>>>> Giles Orr wrote:
>>>>> 2009/7/18 Alex Beamish <talexb-Re5JQEeQqe8AvxtiuMwx3w at public.gmane.org>:
>>>>>> On Sat, Jul 18, 2009 at 11:46 AM, Giles Orr<gilesorr-Re5JQEeQqe8AvxtiuMwx3w at public.gmane.org>
>>>>>> wrote:
>>>>>>> By way of introduction: I'm finally, finally trying to get a new
>>>>>>> edition of the Bashprompt HOWTO out there. This will probably
>>>>>>> result
>>>>>>> in me posting a lot of detailed and mildly weird questions to this
>>>>>>> list. This is the first.
>>>>>>>
>>>>>>> The intention of this script is to figure out how much space the
>>>>>>> files
>>>>>>> in the current directory take up. There are about a million ways to
>>>>>>> do this - and yes, I know that "ls -l" spits out a "total" line: I
>>>>>>> don't know what it's totaling, but my math has never agreed with it
>>>>>>> ... feel free to explain though. I decided that I'd like to do this
>>>>>>> as much in awk as possible since it does decimal math (unlike bash)
>>>>>>> and it's certainly the easiest way to do the text parsing. I've
>>>>>>> tried
>>>>>>> bc as well, but you have to use other utility programs to parse and
>>>>>>> split the input for it.
>>>>>> Sorry, but I usually use the du command for this.
>>>>>>
>>>>>> root at music:/etc/init.d# du -h .
>>>>>> 504K .
>>>>>>
>>>>>> Sometimes I want to know how heavy an entire tree is, so I use
>>>>>>
>>>>>> $ du -sh foo
>>>>>>
>>>>>> The 'h' argument does intelligent size management, so shows K, M
>>>>>> and G.
>>>>>
>>>>> I would love to use "du" because initially it seems like precisely the
>>>>> right tool ... but I want only the sum of the sizes of the files in
>>>>> the current directory, and "du" is by default recursive (which also
>>>>> makes it painfully slow to return, not a good thing for something
>>>>> incorporated into a Bash prompt). If it's possible to stop "du" from
>>>>> recursing, I'll use it immediately - but that looks difficult to
>>>>> impossible. Any thoughts?
>>>>>
>>>>> Thanks to everyone else who answered too: it all helped. It certainly
>>>>> sounds like piping into "awk" is the way to go rather than trying to
>>>>> write a self-contained "awk" script.
>>>>>
>>>>
>>>> Try this:
>>>
>>> DON'T.
>>>
>>>> #!/bin/bash
>>>>
>>>> i=0 j=0 k=0
>>>> echo -n "Enter directory: "
>>>> read dir
>>>> for i in `ls $dir`
>>>
>>> Not only is ls unnecessary, but it will cause the script to fail
>>> if any filenames contain spaces or other pathological characters.
>>> Use:
>>>
>>> for i in "$dir"/*
>>>
>>>> do
>>>> if [ -f $i ]; then
>>>> j=`du -s $i |awk '{print $1}'`
>
> Always quote variable references unless there is a good reason not
> to: "$i". Without them, it fails if the value contains spaces.
Right, like your last point, if there are spaces. Guess it's a good
habit to get into so I'll definitely make a point of it.
>>>> k=`expr $k + $j`
>
> Why are you using an external command for integer arithmetic?
Dunno how to do it in bash, grimace. Than fancy $(( )) stuff? Will have
a go at that instead.
>>>> fi
>>>> done
>>>> echo $k
>
> du -s "$dir"/* | awk '{ total += $1 } END { print total }'
Or I'll just use awk since that's what started this thread :)
>> Interesting, I started with for i in * but that barfs on stuff too.
>
> There are other problems, too. I just reacted to the horrible
> "for i in `ls dir`". There is no point to using ls without any
> options; shell expansion can do it much more efficiently.
>
>> Suppose since I don't have an files I can see with spaces in their
>> names (pathological hatred for such names), it appears to work
>> correctly for me :)
>
> I feel the same way of filenames with spaces, but they are hard to
> avoid. I never create any, but I expect that every distro contains
> many, and downloads often do. Unless you get into the habit of
> handling them, your scripts will fail sooner or later.
Got it, I suppose I should approach writing scripts as more than one off
single use tools and see about making them more robust, your pointers
are very much appreciated.
Jamon
--
The Toronto Linux Users Group. Meetings: http://gtalug.org/
TLUG requests: Linux topics, No HTML, wrap text below 80 columns
How to UNSUBSCRIBE: http://gtalug.org/wiki/Mailing_lists
More information about the Legacy
mailing list