Linux 如何使用';虽然做完成';在狂欢节上
在bash中使用此命令执行操作时遇到问题。以下是我所拥有的:Linux 如何使用';虽然做完成';在狂欢节上,linux,bash,shell,awk,command-line,Linux,Bash,Shell,Awk,Command Line,在bash中使用此命令执行操作时遇到问题。以下是我所拥有的: cat namelist | while read line; do awk '$1 == $line {print $0}' Jan.txt; done 名称列表是一个未重复的名称列表,每行都有每个名称。Jan.txt是一个包含以下信息的文件: ermartin pts/10 Tue Jan 19 09:49 - 10:15 (00:26) 171.66.208.139 sdou pts/6
cat namelist | while read line; do awk '$1 == $line {print $0}' Jan.txt; done
名称列表
是一个未重复的名称列表,每行都有每个名称。Jan.txt是一个包含以下信息的文件:
ermartin pts/10 Tue Jan 19 09:49 - 10:15 (00:26) 171.66.208.139
sdou pts/6 Tue Jan 19 01:52 - 22:20 (9+20:27) 131.243.186.99
sdou pts/2 Tue Jan 19 01:20 - 22:20 (9+20:59) 131.243.186.99
phu pts/2 Sat Jan 16 12:21 - 15:13 (02:52) lbl-ipsec-7667.dhcp.lbl.gov
phu pts/2 Sat Jan 16 10:07 - 12:01 (01:54) lbl-ipsec-7622.dhcp.lbl.gov
sjames pts/5 Fri Jan 15 12:06 - 13:06 (01:00) lakshmi.lbl.gov
ermartin pts/2 Fri Jan 15 08:36 - 12:43 (04:07) 171.66.208.134
ermartin pts/2 Fri Jan 15 08:31 - 08:36 (00:05) 171.66.208.134
camitche pts/4 Thu Jan 14 15:18 - 20:47 (05:28) 171.66.208.134
ermartin pts/2 Thu Jan 14 13:20 - 15:57 (02:36) 171.66.208.139
ermartin pts/2 Thu Jan 14 12:35 - 13:00 (00:25) 171.66.208.139
sjames pts/2 Thu Jan 14 06:17 - 06:27 (00:09) phys1.als.lbl.gov
sjames pts/2 Thu Jan 14 06:17 - 06:17 (00:00) phys1.als.lbl.gov
ermartin pts/0 Wed Jan 13 15:19 - 15:50 (00:31) 171.66.208.139
ermartin pts/0 Wed Jan 13 07:55 - 08:09 (00:13) c-24-130-14-154.hsd1.ca.comcast.net
我只是尝试将名称列表中的名称与此文件匹配,然后对此文件中的每一行信息执行此操作,但当我执行$1==$line
时,它会说这是一个错误。如何正确使用此命令
是否也可以循环几个月,并将其打印为标题,如下所示:
[Jan]
sjames ...hours
sdou ...hours
[Feb]
sjames ...hours
sdou ...hours
首先,awk和shell不共享变量。但是,可以使用-v
选项将shell变量转换为awk变量。以下操作有效,对代码的唯一更改是添加-v line=“$line”
选项:
cat namelist | while read line; do awk -v line="$line" '$1 == line {print $0}' Jan.txt; done
请注意,awk引用的line
变量仅为line
,不带美元符号
上述管道的可能替代品为:
awk 'FNR==NR{a[$1]; next;} $1 in a' namelist Jan.txt
这里,关联数组a
跟踪名称列表中的名称,并使用它来决定是否在Jan.txt中打印行
如果您不打算对数据进行更多的处理(但我认为情况正好相反),那么,正如Shelleter在评论中所建议的,上述内容可以替换为:
grep -Ff namelist Jan.txt
如果要计算名称列表中用户使用的时间,请尝试:
$ awk -F'[ +:()]+' 'FNR==NR{a[$1]; next;} !($1 in a){next} NF==13{b[$1]+=$12+60*$11} NF==14{b[$1]+=$13+60*($12+24*$11)} END{for (n in b)print n,b[n]}' namelist Jan.txt
作为一个例子,考虑这个名字:
$ cat namelist
sdou
phu
计算时间为:
$ awk -F'[ +:()]+' 'FNR==NR{a[$1]; next;} !($1 in a){next} NF==13{b[$1]+=$12+60*$11} NF==14{b[$1]+=$13+60*($12+24*$11)} END{for (n in b)print n,b[n]}' namelist Jan.txt
phu 286
sdou 28406
为了便于阅读,可能更容易在多行中看到相同的代码:
awk -F'[ +:()]+' '
FNR==NR{
a[$1]
next
}
!($1 in a){
next
}
NF==13{
b[$1]+=$12+60*$11
}
NF==14{
b[$1]+=$13+60*($12+24*$11)
}
END{
for (n in b)
print n,b[n]
}
' namelist Jan.txt
phu 286
要按用户和按月跟踪使用情况,请执行以下操作:
$ awk -F'[ +:()]+' 'FNR==NR{a[$1]; next;} !($1 in a){next} NF==13{b[$1"["$4"]"]+=$12+60*$11} NF==14{b[$1"["$4"]"]+=$13+60*($12+24*$11)} END{for (n in b)print n,b[n]}' namelist Jan.txt
phu[Jan] 286
sdou[Jan] 28406
首先,awk和shell不共享变量。但是,可以使用-v
选项将shell变量转换为awk变量。以下操作有效,对代码的唯一更改是添加-v line=“$line”
选项:
cat namelist | while read line; do awk -v line="$line" '$1 == line {print $0}' Jan.txt; done
请注意,awk引用的line
变量仅为line
,不带美元符号
上述管道的可能替代品为:
awk 'FNR==NR{a[$1]; next;} $1 in a' namelist Jan.txt
这里,关联数组a
跟踪名称列表中的名称,并使用它来决定是否在Jan.txt中打印行
如果您不打算对数据进行更多的处理(但我认为情况正好相反),那么,正如Shelleter在评论中所建议的,上述内容可以替换为:
grep -Ff namelist Jan.txt
如果要计算名称列表中用户使用的时间,请尝试:
$ awk -F'[ +:()]+' 'FNR==NR{a[$1]; next;} !($1 in a){next} NF==13{b[$1]+=$12+60*$11} NF==14{b[$1]+=$13+60*($12+24*$11)} END{for (n in b)print n,b[n]}' namelist Jan.txt
作为一个例子,考虑这个名字:
$ cat namelist
sdou
phu
计算时间为:
$ awk -F'[ +:()]+' 'FNR==NR{a[$1]; next;} !($1 in a){next} NF==13{b[$1]+=$12+60*$11} NF==14{b[$1]+=$13+60*($12+24*$11)} END{for (n in b)print n,b[n]}' namelist Jan.txt
phu 286
sdou 28406
为了便于阅读,可能更容易在多行中看到相同的代码:
awk -F'[ +:()]+' '
FNR==NR{
a[$1]
next
}
!($1 in a){
next
}
NF==13{
b[$1]+=$12+60*$11
}
NF==14{
b[$1]+=$13+60*($12+24*$11)
}
END{
for (n in b)
print n,b[n]
}
' namelist Jan.txt
phu 286
要按用户和按月跟踪使用情况,请执行以下操作:
$ awk -F'[ +:()]+' 'FNR==NR{a[$1]; next;} !($1 in a){next} NF==13{b[$1"["$4"]"]+=$12+60*$11} NF==14{b[$1"["$4"]"]+=$13+60*($12+24*$11)} END{for (n in b)print n,b[n]}' namelist Jan.txt
phu[Jan] 286
sdou[Jan] 28406
为什么要每行运行一次awk
,而不是在整个输入过程中只有一个awk
调用过程?顺便说一句,问题与读取时的循环无关;将变量传递到awk
是个问题。在awk'$1==$line'
中,awk
无法访问shell变量line
的内容——即使在读取循环时没有任何,这仍然是正确的。这听起来也像是您试图在Jan.txt文件中“过滤”名称列表中的名称。grep-F-F namelist Jan.txt怎么样?祝你好运。例如,在将文件上的所有名称与“sdou”匹配后,我想计算这个家伙使用的总持续时间,然后用名称和使用的时间输出到一个新文件,然后在原始问题中做出评论,这样你得到的显示如何解决问题的答案可以调整为仅使用POSIX语法,不要打开一个全新的问题,重新开始!为什么要每行运行一次awk
,而不是在整个输入过程中只有一个awk
调用过程?顺便说一句,问题与读取时的循环无关;将变量传递到awk
是个问题。在awk'$1==$line'
中,awk
无法访问shell变量line
的内容——即使在读取循环时没有任何,这仍然是正确的。这听起来也像是您试图在Jan.txt文件中“过滤”名称列表中的名称。grep-F-F namelist Jan.txt怎么样?祝你好运。例如,在将文件上的所有名称与“sdou”匹配后,我想计算这个家伙使用的总持续时间,然后用名称和使用的时间输出到一个新文件,然后在原始问题中做出评论,这样你得到的显示如何解决问题的答案可以调整为仅使用POSIX语法,不要打开一个全新的问题,重新开始!我实际上想做这样的事情:对于文件中的名称:对于名称列表中的名称:如果名称==名称:计算名称的时间并输出到文件我知道如何计算时间。我只是想问一下,我该如何处理那些重要的、让我困惑的循环?我也可以在几个月内循环并将它们打印成一个标题,比如:[Jan]sjames…hours sdou…hours[Feb]sjames…hours sdou…hours我用更好的格式编辑了这篇文章。它可行吗?我实际上想做这样的事情:对于文件中的名称:对于名称列表中的名称:如果名称==名称:计算名称的时间并输出到文件我知道如何计算时间。我只是想问一下,我该如何处理那些重要的、让我困惑的循环?我也可以在几个月内循环并将它们打印成一个标题,比如:[Jan]sjames…hours sdou…hours[Feb]sjames…hours sdou…hours我用更好的格式编辑了这篇文章。这可行吗?