使用 grep/awk 查找/打印文本文件中的特定值

Zar*_*ina 2 freebsd grep awk text-processing

假设我有一个包含以下 5 行的文本文件:

Tue 18 2022 car model: Toyota , car motor: 2001 , car color: blue , year of production: 2018
Thu 19 2022 car model: Mercedes , car color: black , year of production: 2012 , car motor: 4000
Thu 20 2022 used: yes , car motor: 1999 , car model: Mercedes , car color: black , year of production: 2012
Thu 20 2022 car model: Kia , car motor: 1500 , car color: red , used: no , year of production: 2010
Thu 20 2022 price: 150, car model: GMC  , car color: purple , car motor: 3500 , year of production: 2010
Run Code Online (Sandbox Code Playgroud)

我正在寻找 grep/awk (或 freebsd 11 上可用的其他实用程序),它将查找/打印以下条件评估为 TRUE 的每一行:

Phrase "car motor:" followed by a space and then a numerical value greater than 2000
Run Code Online (Sandbox Code Playgroud)

这样的 grep/awk 预计会从文本文件中找到/打印以下行:

Tue 18 2022 car model: Toyota , car motor: 2001 , car color: blue , year of production: 2018
Thu 19 2022 car model: Mercedes , car color: black , year of production: 2012 , car motor: 4000
Thu 20 2022 price: 150, car model: GMC  , car color: purple , car motor: 3500 , year of production: 2010
Run Code Online (Sandbox Code Playgroud)

gle*_*man 14

我认为 perl 将在 freebsd 上可用,并且您的要求可以直接转换:

perl -ne 'print if /car motor: (\d+)/ and $1 > 2000' file
Run Code Online (Sandbox Code Playgroud)


Ed *_*ton 10

使用 GNU awk 将第三个参数匹配到 match():

$ awk 'match($0,/car motor: ([0-9]+)/,a) && (a[1] > 2000)' file
Tue 18 2022 car model: Toyota , car motor: 2001 , car color: blue , year of production: 2018
Thu 19 2022 car model: Mercedes , car color: black , year of production: 2012 , car motor: 4000
Thu 20 2022 price: 150, car model: GMC  , car color: purple , car motor: 3500 , year of production: 2010
Run Code Online (Sandbox Code Playgroud)

或使用任何 awk:

$ awk 'match($0,/car motor: [0-9]+/) && (substr($0,RSTART+11) > 2000)' file
Tue 18 2022 car model: Toyota , car motor: 2001 , car color: blue , year of production: 2018
Thu 19 2022 car model: Mercedes , car color: black , year of production: 2012 , car motor: 4000
Thu 20 2022 price: 150, car model: GMC  , car color: purple , car motor: 3500 , year of production: 2010
Run Code Online (Sandbox Code Playgroud)

或者也可以使用任何 awk,但更神秘一点:

$ awk '{k=$0} sub(/.*car motor: /,"",k) && (k > 2000)' file
Tue 18 2022 car model: Toyota , car motor: 2001 , car color: blue , year of production: 2018
Thu 19 2022 car model: Mercedes , car color: black , year of production: 2012 , car motor: 4000
Thu 20 2022 price: 150, car model: GMC  , car color: purple , car motor: 3500 , year of production: 2010
Run Code Online (Sandbox Code Playgroud)