如何使用 cut 命令获取特定行?
How do I obtain a specific row with the cut command?
背景
我有一个名为 yeet.d
的文件,看起来像这样
JET_FUEL = /steel/beams
ABC_DEF = /michael/jackson
....50 rows later....
SHIA_LEBEOUF = /just/do/it
....73 rows later....
GIVE_FOOD = /very/hungry
NEVER_GONNA = /give/you/up
我熟悉 f and d
options of the cut
命令。 f
选项允许您指定要从中提取的列,而 d
选项允许您指定分隔符。
问题
我想要此输出 return 使用 cut
命令编辑。
/just/do/it
据我所知,这是我要输入的命令的一部分:
cut -f1 -d= yeet.d
鉴于我想要等号右边的值,以等号作为分隔符。然而,这将 return:
/steel/beams
/michael/jackson
....50 rows later....
/just/do/it
....73 rows later....
/very/hungry
/give/you/up
这比我想要的还要多。
问题
如何使用 cut
命令来 return 仅 /just/do/it
而不是上述情况?这与 How to get second last field from a cut command 不同,因为我想 select 一个大文件中的一行,而不仅仅是靠近末尾或开头。
这取决于您要如何识别所需的行。
您可以通过行号来识别它。在这种情况下,您可以使用 sed
cut -f2 -d= yeet.d | sed '53q;d'
这将提取第 53 行。
或者您可以通过关键字来识别它。在这种情况下使用 grep
cut -f2 -d= yeet.d | grep just
这将提取所有包含单词 just.
的行
这看起来用awk
来表达会更容易...
# awk -v _s="${_string}" ' == _s {print }' "${_path}"
## Above could be more _scriptable_ form of bellow example
awk -v _search="/just/do/it" ' == _search {print }' <<'EOF'
JET_FULE = /steal/beams
SHIA_LEBEOUF = /just/do/it
NEVER_GONNA = /give/you/up
EOF
## Either way, output should be similar to
## /just/do/it
-v _something="Some Thing"
位允许将 Bash 变量传递给 awk
== _search
位告诉 awk
仅当列 3
等于 search
字符串
- 要在一行中搜索 sub-string,可以使用
[=22=] ~ _search
{print }
位告诉 awk
到 print
列 3
任何匹配项
并且 <<'EOF'
位告诉 Bash 在打开和关闭 EOF
标签
...但是,上面的仍然会输出重复的匹配项,例如。如果 yeet.d
以某种方式包含...
JET_FULE = /steal/beams
SHIA_LEBEOUF = /just/do/it
NEVER_GONNA = /give/you/up
AGAIN = /just/do/it
... awk
.
会输出两行 /just/do/it
最快的解决方法是将 |
传送到 head -1
,但是 更好的 方法是将 awk
传送到 exit
被告知 print
...
_string='/just/do/it'
_path='yeet.d'
awk -v _s="${_string}" ' == _s {print ; exit}' "${_path}"
...虽然现在假设只需要第一个匹配项,但获得 n
th 是可能的,尽管目前不在问题范围内上次阅读。
更新
到 trip awk
在第一列打印第三列并在第一个匹配后退出可能看起来像...
_string='SHIA_LEBEOUF'
_path='yeet.d'
awk -v _s="${_string}" ' == _s {print ; exit}' "${_path}"
...并进一步概括...
_string='^SHIA_LEBEOUF '
_path='yeet.d'
awk -v _s="${_string}" '[=14=] ~ _s {print ; exit}' "${_path}"
...因为awk
完全获取正则表达式,大部分.
背景
我有一个名为 yeet.d
的文件,看起来像这样
JET_FUEL = /steel/beams
ABC_DEF = /michael/jackson
....50 rows later....
SHIA_LEBEOUF = /just/do/it
....73 rows later....
GIVE_FOOD = /very/hungry
NEVER_GONNA = /give/you/up
我熟悉 f and d
options of the cut
命令。 f
选项允许您指定要从中提取的列,而 d
选项允许您指定分隔符。
问题
我想要此输出 return 使用 cut
命令编辑。
/just/do/it
据我所知,这是我要输入的命令的一部分:
cut -f1 -d= yeet.d
鉴于我想要等号右边的值,以等号作为分隔符。然而,这将 return:
/steel/beams
/michael/jackson
....50 rows later....
/just/do/it
....73 rows later....
/very/hungry
/give/you/up
这比我想要的还要多。
问题
如何使用 cut
命令来 return 仅 /just/do/it
而不是上述情况?这与 How to get second last field from a cut command 不同,因为我想 select 一个大文件中的一行,而不仅仅是靠近末尾或开头。
这取决于您要如何识别所需的行。
您可以通过行号来识别它。在这种情况下,您可以使用 sed
cut -f2 -d= yeet.d | sed '53q;d'
这将提取第 53 行。
或者您可以通过关键字来识别它。在这种情况下使用 grep
cut -f2 -d= yeet.d | grep just
这将提取所有包含单词 just.
的行这看起来用awk
来表达会更容易...
# awk -v _s="${_string}" ' == _s {print }' "${_path}"
## Above could be more _scriptable_ form of bellow example
awk -v _search="/just/do/it" ' == _search {print }' <<'EOF'
JET_FULE = /steal/beams
SHIA_LEBEOUF = /just/do/it
NEVER_GONNA = /give/you/up
EOF
## Either way, output should be similar to
## /just/do/it
-v _something="Some Thing"
位允许将 Bash 变量传递给awk
== _search
位告诉awk
仅当列3
等于search
字符串- 要在一行中搜索 sub-string,可以使用
[=22=] ~ _search
- 要在一行中搜索 sub-string,可以使用
{print }
位告诉awk
到print
列3
任何匹配项并且
<<'EOF'
位告诉 Bash 在打开和关闭EOF
标签
...但是,上面的仍然会输出重复的匹配项,例如。如果 yeet.d
以某种方式包含...
JET_FULE = /steal/beams
SHIA_LEBEOUF = /just/do/it
NEVER_GONNA = /give/you/up
AGAIN = /just/do/it
... awk
.
/just/do/it
最快的解决方法是将 |
传送到 head -1
,但是 更好的 方法是将 awk
传送到 exit
被告知 print
...
_string='/just/do/it'
_path='yeet.d'
awk -v _s="${_string}" ' == _s {print ; exit}' "${_path}"
...虽然现在假设只需要第一个匹配项,但获得 n
th 是可能的,尽管目前不在问题范围内上次阅读。
更新
到 trip awk
在第一列打印第三列并在第一个匹配后退出可能看起来像...
_string='SHIA_LEBEOUF'
_path='yeet.d'
awk -v _s="${_string}" ' == _s {print ; exit}' "${_path}"
...并进一步概括...
_string='^SHIA_LEBEOUF '
_path='yeet.d'
awk -v _s="${_string}" '[=14=] ~ _s {print ; exit}' "${_path}"
...因为awk
完全获取正则表达式,大部分.