如何在Linux中使用子字符串管道从grep输出?

如何在Linux中使用子字符串管道从grep输出?,linux,bash,curl,cygwin,piping,Linux,Bash,Curl,Cygwin,Piping,我正在尝试编写一个脚本,自动登录Drupal网站,使其进入维护模式。这是我到目前为止所拥有的,grep给了我想要的线路 curl http://www.drupalwebsite.org/?q=user | grep '<input type="hidden" name="form_build_id" id="form-[a-zA-Z0-9]*" value="form-[a-zA-Z0-9]*" />' curlhttp://www.drupalwebsite.org/?q=u

我正在尝试编写一个脚本,自动登录Drupal网站,使其进入维护模式。这是我到目前为止所拥有的,grep给了我想要的线路

curl http://www.drupalwebsite.org/?q=user | grep '<input type="hidden" name="form_build_id" id="form-[a-zA-Z0-9]*" value="form-[a-zA-Z0-9]*"  />'
curlhttp://www.drupalwebsite.org/?q=user |格雷普“
现在我有点Linux新手了,我正在用Cygwin和BASH。然后如何通过管道输出并使用命令从grep生成的输出中获取id属性的值?稍后我将使用此子字符串执行另一个curl请求,以实际提交登录


我正在考虑使用expr,但我真的不明白如何告诉expr“哦,嘿,我想让你用这种方式处理这个标准数据”。似乎我能做到这一点的唯一方法是将grep输出保存在变量中,然后将变量输入expr。

您可以使用
-o
选项再次使用
grep
。可能是两个连续的
grep
s,也可以过滤掉周围的
id=“…”
部分

   -o, --only-matching
          Print only the matched (non-empty) parts  of  a  matching  line,
          with each such part on a separate output line.

使用
sed
修剪从
grep
获得的结果,即

编辑:添加myID变量,使用任意名称

myID=$( 
  curl http://www.drupalwebsite.org/?q=user \
  | grep '<input type="hidden" name="form_build_id" id="form-[a-zA-Z0-9]*" value="form-[a-zA-Z0-9]*"  />' \
  | sed 's/^.* id="//;s/" value=.*$//'
)


#use ${myID} later in script
printf "myID=${myID}\n"
(删除不必要的进程是一个好习惯。在这种情况下,这可能无关紧要,但如果您编写的代码将在一小时内执行1000次,那么当您不需要时,有一个额外的grep将创建1000次不需要创建的额外进程。)

您可能必须避开“\<>”或最坏情况下的“[]”等“<和>”字符

我现在使用“@”作为reg-ex替换分隔符,以避免转义srch目标字符串中的任何“/”字符。我继续在整个例子中使用它,只是为了保持一致。对于某些sed,您告诉他们您使用的是非标准分隔符,因此在每个sed代码块的前面都有一个前导\

n表示“不默认打印每行输入”,因此,我们必须在末尾添加“p”,这意味着打印当前缓冲区

最后,我不确定您的正则表达式,特别是
-[a-zA-Z0-9]*
,这意味着前面的字符(或本例中的字符类)为零或更多。通常,想要至少一个字母数字的人会使用
-[a-zA-Z0-9][a-zA-Z0-9]*
,yes或
[:alnum:][:alnum:][:alnum:][]*
,但我对您的数据了解不够清楚,无法确定


我希望这会有所帮助。

我尝试在原始grep上使用-o,它与整行匹配,因此它将返回给您。我还需要它来匹配整条线。我不能过分放纵,因为我不希望页面中其他地方的样式更改使grep返回一些垃圾。以这种方式使用-o的问题是,您必须为*提供一些上下文,当您这样做时,当您使用-o时,该上下文将返回,因此这将永远不会改变我所说的方式。我当时的想法是:
echo'>grep-o'id=“form-[[:alnum:][]*”'|grep-o'form-[:alnum:][]*“
这与
curl | grep
命令的示例输出相呼应,通过两个新的grep首先过滤掉
id
属性,然后过滤掉周围的
id=“…”
垃圾。我就是这样解释你的问题的。:-)@Jazzepi请参见编辑。添加了示例,演示如何“稍后使用[ing]此子字符串执行另一个curl请求”。祝你好运,太好了!效果很好。谢谢也谢谢你的额外帮助。我确实知道如何存储变量,但我很感激这额外的一步。@Jazzepi很高兴这有帮助。不,见编辑2。我们甚至不需要grep(但我没有办法测试它,因为我没有curl的输出来测试)。祝你好运
myID=$( 
  curl http://www.drupalwebsite.org/?q=user \
  | sed -n '\@<input type="hidden" name="form_build_id" id="form-[a-zA-Z0-9]*" value="form-[a-zA-Z0-9]*"  />@{
       s\@^.* id="@@
       s\@" value=.*$@@p
   }'
)