背景
我有一个名为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
我熟悉cut
命令的f and d
选项。f
选项允许您指定要从中提取的列,而d
选项允许您指定分隔符。
问题
我希望使用cut
命令返回此输出。
/just/do/it
据我所知,这是我想要输入的命令的一部分:
cut -f1 -d= yeet.d
假设我想把值放在等号的右边,用等号作为分隔符。但是,这将返回:
/steel/beams
/michael/jackson
....50 rows later....
/just/do/it
....73 rows later....
/very/hungry
/give/you/up
这比我想要的还多。
问题
如何使用cut
命令只返回、、/just/do/it
,而不返回上述情况下的其他内容?这与How to get second last field from a cut command不同,因为我希望在一个大文件中选择一行,而不仅仅是靠近结尾或开头。
发布于 2019-05-31 03:08:10
这看起来更容易用awk
来表达……
# awk -v _s="${_string}" '$3 == _s {print $3}' "${_path}"
## Above could be more _scriptable_ form of bellow example
awk -v _search="/just/do/it" '$3 == _search {print $3}' <<'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
Bash位允许将
-v _something="Some Thing"
变量传递给awk
$3 == _search
位告诉awk
仅当列3
等于search
字符串时才匹配
- To search for a sub-string within a line one can use _`$0 ~ _search`_
{print $3}
位告诉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}" '$3 == _s {print $3; exit}' "${_path}"
..。虽然现在假设只需要第一个匹配项,但获得n
__th是可能的,尽管目前超出了上次阅读的问题的范围。
更新
要在打印第三列时在第一列上触发awk
并在第一个匹配后退出,可能如下所示...
_string='SHIA_LEBEOUF'
_path='yeet.d'
awk -v _s="${_string}" '$1 == _s {print $3; exit}' "${_path}"
..。更进一步的概括。
_string='^SHIA_LEBEOUF '
_path='yeet.d'
awk -v _s="${_string}" '$0 ~ _s {print $3; exit}' "${_path}"
..。因为awk
在很大程度上完全得到了正则表达式。
发布于 2019-05-31 03:06:34
这取决于您希望如何标识所需的行。
您可以通过行号来识别它。在这种情况下,您可以使用sed
cut -f2 -d= yeet.d | sed '53q;d'
这段代码提取了第53行。
或者你可以通过一个关键字来识别它。在这种情况下,使用grep
cut -f2 -d= yeet.d | grep just
这将提取包含单词just的所有行。
https://stackoverflow.com/questions/56383950
复制相似问题