awk过滤()内的数据
时间: 2023-08-11 10:19:09 浏览: 77
可以使用awk的正则表达式和子串提取功能来过滤()内的数据。具体的步骤如下:
1. 使用awk的match函数,查找字符串中第一个出现的()括号对,并将其位置和长度保存在数组a中:
```
awk 'match($0, /\(.*\)/, a) {print a[0]}'
```
2. 使用substr函数提取括号内的内容,注意要去掉括号本身:
```
awk 'match($0, /\(.*\)/, a) {print substr(a[0], 2, length(a[0])-2)}'
```
这样就可以提取出字符串中第一个出现的()括号内的内容了。如果要提取所有括号内的内容,可以使用while循环和gsub函数来实现:
```
awk '{while(match($0, /\(.*\)/, a)) {print substr(a[0], 2, length(a[0])-2); gsub(/\(.*\)/, "", $0)}}'
```
这个命令会不断查找并提取括号内的内容,直到字符串中没有括号为止。
相关问题
awk过滤()内的数据,然后输出第一行数据
可以使用awk的正则表达式匹配和控制语句来实现这个功能。假设我们要过滤的数据是以括号()包围的一行数据,我们可以使用以下命令:
```
awk -F'[()]' '{print $2}' filename | awk 'NR%2==1'
```
解释一下上述命令:
- `-F'[()]'` 表示将左右括号作为分隔符,这样就可以将括号内的数据分离出来。
- `'{print $2}'` 表示输出第二个字段,也就是括号内的数据。
- `|` 表示将前面命令的输出作为后面命令的输入。
- `awk 'NR%2==1'` 表示输出奇数行,也就是我们要求的括号内的第一行数据。
这样,我们就可以过滤出以括号包围的数据,并输出这些数据中的第一行了。
awk过滤多行()内的数据,并输出第一行的
可以使用awk命令的模式匹配和控制语句来实现这个功能。假设我们要过滤的数据是以括号()包围的多行数据,我们可以使用以下命令:
```
awk '/\(/ {flag=1; printf("%s", $0)} /\)/ {flag=0; printf("\n") } flag==1 && NR!=1 {printf("%s", $0)}' filename
```
解释一下上述命令:
- `/(` 匹配以左括号开头的行,如果匹配成功则设置flag为1,表示我们要开始输出数据了。
- `printf("%s", $0)` 输出当前行的内容,但不换行。
- `/\)/` 匹配以右括号结尾的行,如果匹配成功则设置flag为0,表示我们已经输出完数据了。
- `flag==1 && NR!=1 {printf("%s", $0)}` 当flag为1时,表示我们正在输出数据,这时候如果当前行不是第一行,则直接输出当前行的内容。
这样,我们就可以过滤出以括号包围的多行数据,并输出这些数据中的第一行了。
阅读全文