Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使用';虽然做完成';在狂欢节上_Linux_Bash_Shell_Awk_Command Line - Fatal编程技术网

Linux 如何使用';虽然做完成';在狂欢节上

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

在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        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我用更好的格式编辑了这篇文章。这可行吗?