Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从动态生成的输出中获取特定字符串的索引_Linux_Shell_Sed_Awk_Sh - Fatal编程技术网

Linux 从动态生成的输出中获取特定字符串的索引

Linux 从动态生成的输出中获取特定字符串的索引,linux,shell,sed,awk,sh,Linux,Shell,Sed,Awk,Sh,我尝试了很多事情,但现在我已经束手无策了。 我的问题是,我需要从动态生成的输出中获取特定字符串的索引。 在示例中,我希望此输出中字符串“cookie”的索引: 1337 cat dog table cookie 42 所以在这个例子中,我需要这个结果: 5 一个问题是,我需要这个号码,以便以后执行awk命令。另一个问题是,此生成的输出具有灵活的长度,您无法使用“sed”某些内容。-或者别的什么。没有这样的模式 干杯丑陋,但可能: echo '1337 cat dog table cooki

我尝试了很多事情,但现在我已经束手无策了。
我的问题是,我需要从动态生成的输出中获取特定字符串的索引。

在示例中,我希望此输出中字符串“cookie”的索引:

1337 cat dog table cookie 42
所以在这个例子中,我需要这个结果:

5
一个问题是,我需要这个号码,以便以后执行awk命令。另一个问题是,此生成的输出具有灵活的长度,您无法使用“sed”某些内容。-或者别的什么。没有这样的模式

干杯

丑陋,但可能:

echo '1337 cat dog table cookie 42' \
    | tr ' ' '\n'                   \
    | grep -Fn cookie               \
    | cut -f1 -d:
丑陋,但可能:

echo '1337 cat dog table cookie 42' \
    | tr ' ' '\n'                   \
    | grep -Fn cookie               \
    | cut -f1 -d:
如果有9个以上的COL,则可以制作更复杂的sed或通过
wc-c


如果有9个以上的COL,则可以生成或通过
wc-c
而不是生成更复杂的sed。这里有一种方法,可以使用
gnu awk
(由于RS)查找字符串中单词的位置,并将其存储到变量中

pat="cookie"
pos=$(echo "1337 cat dog table cookie 42" | awk '{print NF+1;exit}' RS="$pat")
echo "$pos"
5
如果您没有
gnu awk

pat="cookie"
pos=$(echo "1337 cat dog table cookie 42" | awk '{for (i=1;i<=NF;i++) if ($i~p) print i}' p="$pat")
echo "$pos"
5
pat=“cookie”

pos=$(echo“1337 cat dog table cookie 42”| awk'{for(i=1;i这里有一种方法可以使用
gnu awk
(由于RS)查找字符串中单词的位置,并将其存储到变量中

pat="cookie"
pos=$(echo "1337 cat dog table cookie 42" | awk '{print NF+1;exit}' RS="$pat")
echo "$pos"
5
如果您没有
gnu awk

pat="cookie"
pos=$(echo "1337 cat dog table cookie 42" | awk '{for (i=1;i<=NF;i++) if ($i~p) print i}' p="$pat")
echo "$pos"
5
pat=“cookie”

pos=$(echo“1337 cat dog table cookie 42”| awk'{for(i=1;i这里是使用数组的纯bash方法,不需要sed、awk或GNUs;-)

#加载数组时,可以使用自己的命令代替echo
数组=($(echo 1337猫狗表cookie 42))
#展示我们所拥有的
echo${array[*]}
1337猫狗桌饼干42
#找到包含我们的模式的元素

对于((i=0;i这里是使用数组的纯bash方法,不需要sed、awk或GNUs;-)

#加载数组时,可以使用自己的命令代替echo
数组=($(echo 1337猫狗表cookie 42))
#展示我们所拥有的
echo${array[*]}
1337猫狗桌饼干42
#找到包含我们的模式的元素

对于((i=0;i只需创建一个数组,将字符串值映射到其索引,然后打印条目:

$ cat file
1337 cat dog table cookie 42

$ awk -v v="cookie" '{v2i[v]=0; for (i=1;i<=NF;i++) v2i[$i]=i; print v2i[v]}' file            
5
$cat文件
1337猫狗桌饼干42

$awk-v v=“cookie”{v2i[v]=0;对于(i=1;i只需创建一个数组,将字符串值映射到其索引,然后打印条目:

$ cat file
1337 cat dog table cookie 42

$ awk -v v="cookie" '{v2i[v]=0; for (i=1;i<=NF;i++) v2i[$i]=i; print v2i[v]}' file            
5
$cat文件
1337猫狗桌饼干42

$awk-v v=“cookie”{v2i[v]=0;for(i=1;i这里是另一个答案,不使用数组,也不使用“sed”或“awk”或“tr”,只是基于bash-IFS为您分隔值:

#!/bin/bash
output="cat dog mouse cookie 42"  # Or output=$(yourProgram)
f=0 # f will be your answer
i=0 # i counts the fields
for x in $output; do \
   ((i++)); [[ "$x" = "cookie" ]] && f=$i; \
done
echo $f
结果:

 4
或者,如果删除反斜杠,可以将所有内容放在一行上,如下所示:

#!/bin/bash
output="cat dog mouse cookie 42"  # Or output=$(yourProgram)
f=0;i=0;for x in $output; do ((i++)); [[ "$x" = "cookie" ]] && f=$i; done
echo $f
说明:

“[[a=b]]&&c”部分只是

if [a=b]; then
   c
fi

它依赖于逻辑的快捷计算。基本上,我们要求shell确定两个语句“a等于b”和语句“c”都是真的。如果a不等于b,它已经知道它不需要计算c,因为它们不可能都是真的-因此f不会得到i的值。另一方面,如果a等于b,shell仍然必须计算语句“c”要查看它是否也是真的,当它这样做时,f将得到i的值。

这里是另一个答案,不使用数组,也不使用“sed”或“awk”或“tr”,只是基于bash-IFS为您分隔值:

#!/bin/bash
output="cat dog mouse cookie 42"  # Or output=$(yourProgram)
f=0 # f will be your answer
i=0 # i counts the fields
for x in $output; do \
   ((i++)); [[ "$x" = "cookie" ]] && f=$i; \
done
echo $f
结果:

 4
或者,如果删除反斜杠,可以将所有内容放在一行上,如下所示:

#!/bin/bash
output="cat dog mouse cookie 42"  # Or output=$(yourProgram)
f=0;i=0;for x in $output; do ((i++)); [[ "$x" = "cookie" ]] && f=$i; done
echo $f
说明:

“[[a=b]]&&c”部分只是

if [a=b]; then
   c
fi

它依赖于逻辑的快捷计算。基本上,我们要求shell确定两个语句“a等于b”和语句“c”都是真的。如果a不等于b,它已经知道它不需要计算c,因为它们不可能都是真的-因此f不会得到i的值。另一方面,如果a等于b,shell仍然必须计算语句“c”以查看它是否也是真的-当它这样做时,f将得到i的值。

U想要单词的索引“饼干"对吗?对!问题是下面提供的解决方案对我的输出模式不起作用。我认为问题在于tr命令和“”的替换,有时两者之间没有空格,我在输出中搜索字符串“pdu”。我收到一个正确的字符串,另一个是三行等待,然后是另一个等待就是这样。但很简单,我需要索引。@Marcel举了另一个例子,
有时之间没有空格,我在输出中搜索字符串“pdu”。
具有预期的输出。您的示例显示了“索引”的概念,即空格分隔字符串的相对位置。鉴于此,我无法想象您的意思正如@Kent所说,“有时中间没有空格”,请展示一些更具代表性的输入和涵盖其他情况的预期输出"对吗?对!问题是下面提供的解决方案对我的输出模式不起作用。我认为问题在于tr命令和“”的替换,有时两者之间没有空格,我在输出中搜索字符串“pdu”。我收到一个正确的字符串,另一个是三行等待,然后是另一个等待就是这样。但很简单,我需要索引。@Marcel举了另一个例子,
有时之间没有空格,我在输出中搜索字符串“pdu”。
具有预期的输出。您的示例显示了“索引”的概念,即空格分隔字符串的相对位置。鉴于此,我无法想象您的意思“有时两者之间没有空间"因此,正如@Kent所说,请展示一些更具代表性的输入和涵盖其他情况的预期输出。对!问题在于,提供的解决方案不适用于我的输出模式,因为它是一个更复杂的日志。我认为问题在于tr命令和“”的替换,有时,我和在我的中搜索我的字符串“pdu”