Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Formatting text in BASH

Tags:

linux

bash

shell

I am absolute beginner to Shell scripting. My task is to make a script, which will show functions used in a file (caller and callee). I have used objdump, grep, awk etc. to get this output:

000000000040090d <usage>:
000000000040095d <failure>:
  400970:   e8 98 ff ff ff          callq  40090d <usage>
000000000040097f <strton>:
  4009bc:   e8 9c ff ff ff          callq  40095d <failure>
00000000004009c6 <main>:
  400a0e:   e8 6c ff ff ff          callq  40097f <strton>
  400a26:   e8 32 ff ff ff          callq  40095d <failure>
  400a41:   e8 39 ff ff ff          callq  40097f <strton>
  400a59:   e8 ff fe ff ff          callq  40095d <failure>
  400a9a:   e8 be fe ff ff          callq  40095d <failure>
  400aae:   e8 cc fe ff ff          callq  40097f <strton>
  400ac2:   e8 b8 fe ff ff          callq  40097f <strton>
  400ad1:   e8 87 fe ff ff          callq  40095d <failure>
  400afe:   e8 fe 01 00 00          callq  400d01 <set_timeout>
  400b1c:   e8 3c fe ff ff          callq  40095d <failure>
  400b26:   e8 19 00 00 00          callq  400b44 <print_fib_upto>
  400b37:   e8 89 00 00 00          callq  400bc5 <print_ackermann>

Okay, the result should look like this:

failure -> usage
strton -> failure
main -> failure
main -> print_ackermann
main -> print_fib_upto
main -> set_timeout
main -> strton

But I have no idea how to accomplish it. I'd know how to do it in C, etc, but not here. I think this is the right pseudo-code.

If (end of line == ">:")
         caller == last column;
         while (end of line == ">") {
                   callee == last column;
                   echo "$caller -> $callee"
         }

Can anyone tell me, how to write this in BASH? Thank you very much, Maybe it's a silly question, but I don't know anyting about shell yet.

like image 549
user3021851 Avatar asked Dec 11 '22 07:12

user3021851


1 Answers

For example:

#!/bin/bash    
while read -r line
do
    case "$line" in
        *:) caller=$line; continue;;
        *)  echo "$caller $line";;
    esac
done < <(sed 's/.*</</' < caldata) | sed 's/[<>]//g;s/:/ -> /' | sort -u

produces:

failure ->  usage
main ->  failure
main ->  print_ackermann
main ->  print_fib_upto
main ->  set_timeout
main ->  strton
strton ->  failure
like image 190
jm666 Avatar answered Dec 31 '22 00:12

jm666