1

Drupal Web サイトに自動的にログインしてメンテナンス モードにするスクリプトを作成しようとしています。ここに私がこれまでに持っているものがあります.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 初心者で、Cygwin と BASH を使用しています。次に、出力をパイプし、コマンドを使用して、grep が生成した出力から id 属性の値を取得するにはどうすればよいでしょうか? 後でこの部分文字列を使用して、別の curl リクエストを実行し、実際にログインを送信します。

expr の使用を検討していましたが、expr に「ああ、この stdin データをこのように操作してほしい」と伝える方法がよくわかりません。これを行う唯一の方法は、grep出力を変数に保存してから、その変数をexprに渡すことです。

4

2 に答える 2

1

grepオプションで再度ご利用いただけ-oます。場合によっては、周囲の部分grepも除外するための2 つの連続した です。id="..."

   -o, --only-matching
          Print only the matched (non-empty) parts  of  a  matching  line,
          with each such part on a separate output line.
于 2012-01-28T23:57:49.663 に答える
1

sedから取得した結果をトリミングするために使用しますgrep

edit : 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=") を削除し、2 番目の部分はすべての を削除します" value= ....

sed「;」で区切ることにより、複数のサブ置換アクションを連鎖させることができることに注意してください。

edit2 また、sed を使用している場合は、grep を使用する理由はありません。これを試してください。

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
   }'
)

(不要なプロセスを削除するのは良い習慣です。この場合は問題にならないかもしれませんが、1 時間に何千回も実行されるコードを記述している場合は、実行しないときに余分な grep が必要です。作成する必要のない何千もの余分なプロセスを作成する必要はありません。)

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

srch-target 文字列内の「/」文字をエスケープする必要がないように、正規表現の置換セパレータとして「@」を使用しています。そして、一貫性を保つために、例全体で引き続き使用しています。一部の sed では、非標準のセパレーターを使用していることを伝えているため、sed コードの各ブロックの先頭に \@ があります。

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

最後に、正規表現、特に についてはわかりません-[a-zA-Z0-9]*。これは、前の文字 (またはこの場合は文字クラス) が 0 個以上であることを意味します。通常、少なくとも1つの英数字が必要な人は-[a-zA-Z0-9][a-zA-Z0-9]*、 , yes ORを使用[[:alnum:]][[:alnum:]]*しますが、確かに言えるほどあなたのデータをよく知りません.

これが役立つことを願っています。

于 2012-01-29T00:14:07.303 に答える