如何在Linux中使用子字符串管道从grep输出?
我正在尝试编写一个脚本,自动登录Drupal网站,使其进入维护模式。这是我到目前为止所拥有的,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
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
}'
)