Nid*_*dal 5 shell-script text-processing
假设我有这个文件:
Thu May 8 15:32:07 2014
User-Name = "Mark"
Framed-IP-Address = 0.0.0.0
Acct-Status-Type = Interim-Update
Acct-Input-Octets = 95684
Acct-Output-Octets = 23564
Thu May 8 15:32:07 2014
User-Name = "Mike"
Framed-IP-Address = 0.0.0.0
Acct-Status-Type = Interim-Update
Acct-Input-Octets = 95684
Acct-Output-Octets = 23564
Thu May 8 15:32:07 2014
User-Name = "Mike"
Framed-IP-Address = 0.0.0.0
Acct-Status-Type = Interim-Update
Acct-Input-Octets = 95684
Acct-Output-Octets = 23564
Thu May 8 15:32:07 2014
User-Name = "Mark"
Framed-IP-Address = 0.0.0.0
Acct-Status-Type = Interim-Update
Acct-Input-Octets = 95684
Acct-Output-Octets = 23564
Run Code Online (Sandbox Code Playgroud)
我已经设法获取与使用grep
with-A
选项的用户相关的信息:
grep -A4 "Mark" test
User-Name = "Mark"
Framed-IP-Address = 0.0.0.0
Acct-Status-Type = Interim-Update
Acct-Input-Octets = 95684
Acct-Output-Octets = 23564
--
User-Name = "Mark"
Framed-IP-Address = 0.0.0.0
Acct-Status-Type = Interim-Update
Acct-Input-Octets = 95684
Acct-Output-Octets = 23564
Run Code Online (Sandbox Code Playgroud)
但我想要的输出是这样的:
User-Name = "Mark"
Acct-Input-Octets = 95684 95684
Acct-Output-Octets = 23564 23564
Run Code Online (Sandbox Code Playgroud)
正如我们注意到的,我想消除 "Mark" 之后的前两行Framed-IP-Address = 0.0.0.0
,Acct-Status-Type = Interim-Update
并将同一字段的所有值放在同一行中?
正如沃里克所建议的那样,我的问题的第一部分可以很容易地回答:
grep -A4 "Mark" test| grep -v Framed-IP-Address | grep -v Acct-Status-Type
Run Code Online (Sandbox Code Playgroud)
请注意,这是一个示例,该文件可能包含很多 User-Name ="Mark" 的部分,并且所需的输出将是这样的:
User-Name = "Mark"
Acct-Input-Octets = val1 val2 val3 val4 .......
Acct-Output-Octets = val1 val2 val3 val4 ........
Run Code Online (Sandbox Code Playgroud)
search.awk
BEGIN {
FS = "="
cur_username = ""
}
$1 ~ /User-Name/ {
cur_username = $2
gsub(/^[ \t]+/, "", cur_username)
gsub(/[ \t]+$/, "", cur_username)
}
$1 !~ /User-Name/ {
if ((NF != 2) || (cur_username != searched_user))
next
key = $1
gsub(/^[ \t]+/, "", key)
gsub(/[ \t]+$/, "", key)
value = $2
gsub(/^[ \t]+/, "", value)
gsub(/[ \t]+$/, "", value)
values[key] = values[key] " " value
}
END {
printf("User-Name = %s\n", searched_user)
for(key in values) {
printf("\t%s =%s\n", key, values[key])
}
}
Run Code Online (Sandbox Code Playgroud)
测试运行:
$ awk -f search.awk -v 'searched_user="Mark"' input
User-Name = "Mark"
Acct-Status-Type = Interim-Update Interim-Update
Acct-Input-Octets = 95684 95684
Framed-IP-Address = 0.0.0.0 0.0.0.0
Acct-Output-Octets = 23564 23564
Run Code Online (Sandbox Code Playgroud)
奖励 -group.awk
用于对所有记录进行分组(可惜nawk没有asorti
):
BEGIN {
FS = "="
cur_username = ""
}
$1 ~ /User-Name/ {
cur_username = $2
gsub(/^[ \t]+/, "", cur_username)
gsub(/[ \t]+$/, "", cur_username)
}
$1 !~ /User-Name/ {
if (NF != 2)
next
key = $1
gsub(/^[ \t]+/, "", key)
gsub(/[ \t]+$/, "", key)
value = $2
gsub(/^[ \t]+/, "", value)
gsub(/[ \t]+$/, "", value)
users[cur_username,key] = users[cur_username,key] " " value
}
END {
n = asorti(users, sorted)
prev_username = ""
for (i=1; i<=n; i++) {
username_key = sorted[i]
split(username_key, a, SUBSEP)
username = a[1]
key = a[2]
value = users[sorted[i]]
if (username != prev_username) {
printf("User-Name = %s\n", username)
prev_username = username
}
printf("\t%s =%s\n", key, value)
}
}
Run Code Online (Sandbox Code Playgroud)
测试运行:
$ gawk -f group.awk input
User-Name = "Mark"
Acct-Input-Octets = 95684 95684
...
User-Name = "Mike"
Acct-Input-Octets = 95684 95684
...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
214 次 |
最近记录: |