如何按顺序打印与正则表达式匹配的元素?

时间:2018-03-05 01:40:45

标签: awk

我有一个文本文件,其格式为以下格式:

ptr[0] = Alloc(1)  returned 1000 (searched 1 elements)
Free List [ Size 1 ]:  [ addr:1001 sz:99 ] 

Free(ptr[0]) returned 0
Free List [ Size 2 ]:  [ addr:1000 sz:1 ] [ addr:1001 sz:99 ] 

ptr[1] = Alloc(7)  returned 1001 (searched 2 elements)
Free List [ Size 2 ]:  [ addr:1000 sz:1 ] [ addr:1008 sz:92 ] 

Free(ptr[1]) returned 0
Free List [ Size 3 ]:  [ addr:1000 sz:1 ] [ addr:1001 sz:7 ] [ addr:1008 sz:92 ] 

ptr[2] = Alloc(5)  returned 1001 (searched 3 elements)
Free List [ Size 3 ]:  [ addr:1000 sz:1 ] [ addr:1006 sz:2 ] [ addr:1008 sz:92 ] 

Free(ptr[2]) returned 0
Free List [ Size 5 ]:  [ addr:1000 sz:1 ] [ addr:1001 sz:5 ] [ addr:1006 sz:2 ] [ addr:1008 sz:8 ] [ addr:1016 sz:84 ] 

我正在尝试仅打印出与文本文件中的sz:匹配的值,并按照它们所在的顺序打印它们,但作为列表。像这样:

$ awk -f list.awk file.txt | head
99
1 99
1 92
1 7 92
1 2 92
1 5 2 8 84

我已尝试过以下操作,但只打印出包含sz:的行。我怎么能进一步打破它以获得我想要的输出?

/Free List/{
s = $0
split(s, a, /sz:/)
print s
}

4 个答案:

答案 0 :(得分:2)

关注int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE); if (permissionCheck != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.CALL_PHONE}, 999); } else { startActivity(new Intent(Intent.ACTION_CALL).setData(Uri.parse("tel: your_phone_number"))); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case 999: if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) { startActivity(new Intent(Intent.ACTION_CALL).setData(Uri.parse("tel:your_phone_number"))); } break; default: break; } } 解决方案可能对您有帮助。

解决方案1: 当您只想要与字符串awk相关联的数字值时,以下内容可能对您有所帮助。

sz

现在也添加非单线形式的解决方案。

awk '{while(match($0,/sz:[0-9]+/)){val=(val?val FS:"") substr($0,RSTART+3,RLENGTH-3);$0=substr($0,RSTART+RLENGTH)}}val!=""{print val;val=""}'  Input_file

解决方案第二: 如果您还需要将字符串awk ' { while(match($0,/sz:[0-9]+/)){ val=(val?val FS:"") substr($0,RSTART+3,RLENGTH-3); $0=substr($0,RSTART+RLENGTH)} } val!=""{ print val; val="" } ' Input_file 与值相关联,那么以下内容可能对您有帮助。

sz

现在也添加一种非单一的衬里形式的解决方案。

awk '{while(match($0,/sz:[0-9]+/)){val=(val?val FS:"") substr($0,RSTART+3,RLENGTH-3);$0=substr($0,RSTART+RLENGTH)}}val!=""{print val;val=""}' Input_file

注意: 如果您只想对那些带有字符串awk ' { while(match($0,/sz:[0-9]+/)){ val=(val?val FS:"") substr($0,RSTART+3,RLENGTH-3); $0=substr($0,RSTART+RLENGTH)} } val!=""{ print val; val="" } ' Input_file 的行执行此操作,请在{{1}之前添加Free List在上述解决方案中简单地在/Free List/{之前添加while

答案 1 :(得分:1)

如果perl没问题:

$ perl -lne 'print join " ", /sz:(\d+)/g if /Free List/' ip.txt
99
1 99
1 92
1 7 92
1 2 92
1 5 2 8 84

答案 2 :(得分:0)

使用bash和grep:

while IFS= read -r line; do
    x=$(grep -oP '(sz:\K\d+)' <<< "$line")
    [[ $x ]] && echo $x
done < file

输出:

99
1 99
1 92
1 7 92
1 2 92
1 5 2 8 84

答案 3 :(得分:0)

使用GNU awk for FPAT:

df[0]

任何awk:

('apa', 'apc')