2012-01-28 2 views
1

私はDrupalウェブサイトにログインするためのスクリプトを自動的に作成してメンテナンスモードにしています。これまで私がこれまで持っていたことは、grepが私に必要な行を返すことです。Linuxで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]*" />' 

私はLinux初心者ですが、私はBASHでCygwinを使用しています。どのように出力をパイプし、grepが生成した出力からid属性の値を取得するためのコマンドを使用するのですか?このサブストリングを後で使用して、実際にログインを送信する別のカール要求を行います。

私はexprの使用を検討していましたが、私はexprにどうやって言うか分かりません。私がこれを行うことができる唯一の方法は、変数にgrep出力を保存しておき、変数をexprに渡すことです。

答えて

1

使用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" 

最初の部分が文字列の「前面」部分を削除し、すべてがid="まで、第二の部分は、すべての" value= ....を削除しながら。

sedに複数のサブ置換アクションを連結するには、 ';'で区切ってください。あなたはsedを使用しているいったん

またEDIT2 、グレップを使用する理由はありません、これを試してみてください。

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=.*[email protected]@p 
    }' 
) 

(これは、不要なプロセスを除去するに入るために良い習慣だそれはないかもしれません。この場合の問題ですが、1時間に1000秒実行されるコードを書いている場所に到達した場合、必要のないときに追加のgrepを持つことは、必要のない余分なプロセスを1000個作成することです)

「<」からエスケープする必要があります。 > '' \ <> 'または最悪の場合' [<] [>]のような文字。

私はsrch-target文字列の '/'文字をエスケープするのを避けるために、reg-ex置換区切り文字として '@'を使用しています。そして私は全体の例でそれを使い続けています。いくつかのsedについては、非標準のセパレータを使用していることを伝えているので、sedコードの各ブロックの先頭に\ @をつけています。

-nは「各行の入力をデフォルトで印刷しない」ことを意味し、そのために最後に 'p'を追加する必要があります。つまり、現在のバッファを印刷することを意味します。

最後に、あなたの正規表現、特に-[a-zA-Z0-9]*についてはわかりません。これは前の文字(この場合は文字クラス)がゼロ以上あることを意味します。通常、英数字を1文字以上入力したい場合は、-[a-zA-Z0-9][a-zA-Z0-9]*、またはOR [[:alnum:]][[:alnum:]]*を使用しますが、私は確かにあなたのデータをよく知っていません。

こちらがお役に立てば幸いです。

+0

@Jazzepi編集を参照してください。この部分文字列を後で別のカール要求を行うために[使用する]方法を示す例を追加しました。がんばろう。 – shellter

+0

パーフェクト!よく働く。ありがとう!また、余分なビットありがとう。私は実際に変数を格納する方法を知っていますが、余計なステップがありがたいです。 – Jazzepi

+0

@Jazzepi喜んで助けた。エディット2は表示されません。 grepは必要ありません(ただし、テストするためのカールの出力がないため、これをテストする方法はありません)。がんばろう。 – shellter

1

もう一度-oオプションを使用してgrepを使用できます。おそらく2つの連続したgrepも、周囲の部分をフィルタリングするためにid="..."部分です。

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

元のgrepで-oを使ってみましたが、それは行全体と一致していました。私はまた、それはライン全体に一致する必要があります。 grepにいくつかの迷惑をかけさせるために、ページ内の他の場所でスタイルを変更したくないので、私は大変許してもいけません。このように-oを使用する際の問題は、*にいくつかのコンテキストを指定しなければならないことです。-oを使用するとそのコンテキストが返されるため、これは決して私が話している方法をトリミングしません。 – Jazzepi

+0

私が考えていたのは、 'echo ''のようなものでした。 grep -o 'id = "フォーム - [[:alnum:]] *"' | grep -o 'form - [[:alnum:]] *' 'これは、あなたの' curl | grep'コマンドを実行し、最初に 'id'属性を除外してから' id = "..." 'ゴミを取り除きます。それがあなたの質問を解釈する方法です。 :-) –

関連する問題