模式滤波器端子

模式滤波器端子

我的最后一个脚本生成了一个包含文件前 10 行和后 10 行的 txt 文档/etc/passwd。我想通过显示以下范围内的前 3 个单词来过滤文件中的 20 行*:*:*:(其中*=words)

以下是我正在努力解决但无法完成的问题:

#!/bin/bash
echo "**********************************"
echo "Today is: "$(date "+%d%m%Y")
echo "**********************************"
echo "This are the data that last script generated"
echo "**********************************"
echo
echo $(grep *:*:*: /tmp/test-file)

答案1

由于/etc/passwd是由稳定分隔符分隔的字段列表(非常类似于CSV),你应该使用可以与它们一起使用的命令,例如cut或者awk(对于更复杂的操作)。

在这种情况下,cut就足够了:

cut -d: -f-3

解释:

  • 该标志-d设置分隔符(或字段分隔符)。我们需要:在这里。
  • 该标志-f选择要打印的字段。-3表示“最多3列”。

例子:

$ cut -d: -f-3 /etc/passwd | head
root:x:0
daemon:x:1
bin:x:2
sys:x:3
sync:x:4
games:x:5
man:x:6
lp:x:7
mail:x:8
news:x:9

顺便说一句,发布 是多余的echo $(command)。直接使用command

答案2

如果需要使用,grep可以将每行的前三个字段与

grep -o '^[^:]*:[^:]*:[^:]*'

这将匹配行首 ( ^),然后匹配除冒号:后跟冒号:等之外的所有内容。由于使用了-o选项,grep因此仅打印匹配行的匹配(非空)部分,请参阅man grep。以下是 的第一行和最后一行的示例/etc/passwd

$ grep -oh '^[^:]*:[^:]*:[^:]*' <(head -2 /etc/passwd) <(tail -2 /etc/passwd)
root:x:0
daemon:x:1
timidity:x:122
geoclue:x:123

在此处详细了解基本正则表达式 (BRE) 的使用https://www.regular-expressions.info/gnu.html

答案3

使用 awk:

$ awk -F: 'NR<=20 && NF=3' /etc/passwd
root x 0
daemon x 1
bin x 2
sys x 3
sync x 4
games x 5
...
  • if NR<=20(NR=寄存器编号) 并且
  • ... 设置NF为 3 后(NF=字段数)
  • ... 打印(默认操作)

抱歉,我偷偷摸摸地

相关内容