1、参考awk处理多行文本的记录_weixin_30457465的博客-CSDN博客,
对其中的脚本代码增加注释说明
#!/usr/bin/awk -f
# 设置输入流的分隔符号,根据分割符号拆分为一个个记录record
BEGIN {RS="spawn"}
{
# 遍历各个记录,确认本记录内是否存在字符串Version 123
if(index($0,"Version 123"))
{
# 查找确认字符串user_00@位置索引
at_i=index($0,"user_00@");
pound_i=index($0,"#36000");
print substr($0,at_i+8,pound_i-at_i-8)
}
}
2、awk正确表达式中是单引号‘’
3、将输入文件input.c中的函数根据real_t分割为多个子文件,各个子文件名以对应函数的行号
awk '$1 == "real_t" { line=NR } { print $line, $0 >> line".c" }' input.c
或者 以 ) 为结尾符
awk '{ if ($0~/)$/) { line=NR; print "#include \"my.h\"" >> line".c" } { print $0 >> line".c" }}' input.c
4、将反汇编dump根据函数为区间,拆分成多个子文件
awk '{ if ($0~/^000000/) { len=length($2); name=substr($2, 2, len-3); } { print $0 >> name".dump" }}' demo.dump
说明:$0~/^000000/ 匹配文本块以000000开始的字符串作为分割
$2将匹配对应的函数名<_init>:,因此有三个无效字符
substr字符串下标从1开始,因此去掉第一个字符的第一个参数为2
文件名有最长字符串限制,可以类似if (len>50) {len=50};进行截断
5、shell 中文件读取操作
while read line; do # 一次line中记录一行数据
done < file
for i in file;do # 若一行中有多个参数,按需每次读取一个,也就是并不保证一整行
done