【问题标题】:How to use awk only once to yield different values如何只使用一次 awk 来产生不同的值
【发布时间】:2016-02-19 00:54:51
【问题描述】:

我正在尝试获取其中引用的密码值

双引号和最后一个字段的用户名值,当我在 尝试 "sed RRp '/^\s*$/d' | awk -F'"' '{print $2, $NF}'" 它需要 第二个字段正确,其余字段取所有输出。

文件内容...

# cat RRp 
echo "Aj12*$" | passwd --stdin appkll 
echo "Aj12*$" | passwd --stdin horfon  
echo "Agik14#" | passwd --stdin attino

虽然我在下面实现了它,但我使用了两次 awk,我们可以瘦身吗 它只有一次..

# sed '/^$/d'  RRp | awk -F'"'  '{print $2,  $NF}'| awk  '{print $1,$5}' | column -t
Aj12*$    appkll
AgkFR1!   horfon
Agik14#   attino

预期输出

Aj12*$    appkll
AgkFR1!   horfon
Agik14#   attino

【问题讨论】:

  • @Ed - 我已经编辑了包含文件内容和预期输出的帖子
  • awk '{gsub(/"/,"",$2);print $2 "\t" $6}' file 应该接近您指定的值。祝你好运。
  • @Karn - 您在第 2 列中的密码可以包含 " 吗?例如。 Ag"kFR# ?
  • @vk239 - 是的,它包含。
  • @shellter - 提供 gsub 的 awk 不能完全正常工作,因为它采用“|” (管道)在输出与字段 2 之间。

标签: awk


【解决方案1】:
$ awk -F'[" ]+' -v OFS='\t' '{print $2, $6}' file
Aj12*$  appkll
Aj12*$  horfon
Agik14# attino

或跳过空白行并在末尾假设列:

awk -F'[" ]+' 'NF{print $2, $6}' file | column -t

【讨论】:

  • 这个解决方案工作正常,我仍然需要使用column -t 来获得更好的输出显示,因为它会抑制两个空白行并在字段之间提供相等的空格:-)。你能解释一下代码设计吗?
  • 参见 www.grymoire.com/Unix/Awk.html 上的 awk 教程。祝你好运。
  • 代码设计绝对是基本的 awk,与您拥有的没有太大区别。 man awk 如果您不确定其中的任何部分。 awk 也可以简单地抑制空白行,但是您没有在问题的示例输入/输出中显示任何内容,因此您在答案中没有。我将对其进行更新以跳过空白行并删除选项卡 OFS,因为如果您正在管道到列,则不需要它。
  • @Ed - 太完美了,我得到了它的合成。
  • 如果我们使用column -t,则不需要NF,因为它会修剪两个空白行并放置更好的输出以及分隔空格。
【解决方案2】:
awk '{gsub(/"/,"",$2);print $2 "\t" $6}' file

如果您的密码是输入文件的第 2 列,则上面提到的 cmets 中的 shellter 应该可以正常工作,而输入文件中不应包含 "(例如 Ag"kFR#)。

如果密码可以包含",您可以使用substr 去掉第2 列开头和结尾的引号,如下所示:

awk '{print substr($2,2,length($2)-2) "\t" $6}' file

【讨论】:

  • awk 与 gsub 和 substr 提供也采用“|” (管道)在输出之间与 ...like Ag15^#e|
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多