我的最后一个脚本生成了一个包含文件前 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=字段数) - ... 打印(默认操作)
抱歉,我偷偷摸摸地