与えられた行番号のパターンに基づいてデータを抽出します。

与えられた行番号のパターンに基づいてデータを抽出します。

次の行(6行目)を見つけようとしています。

"password": "......."

line で始まるすべてのファイルから"whatever here": "...."

その後、記号の後に書かれた内容を抽出し、追加の単語と文字の両方を削除したいと思います:。 "password": "" と引用符の間に ........ 部分を取得します。

後でこの変数を同じスクリプトの新しいコマンドに置き換えてURLを取得したいので、これを新しい変数(ここではuser1と命名しました)として定義したいと思います。

このコマンドを使用しましたが、動作しません。

 user1=`head -6| grep -v "\<"password:"\>" myfile.txt`

 wget '....$user1&......

誰でも私を助けることができますか?私はこれを数日間調べてきましたが、これはわかりません。

答え1

努力する:

user1=$(
  sed -n '
    6!d; # disregard any line but the 6th one
    s/^[[:blank:]]*"password"[[:blank:]]*:[[:blank:]]*"\(.*\)".*/\1/p
    q' myfile.txt
)

CGI GETパラメータに渡すには、そのパラメータをエンコードする$user1必要があります。%XX

を使用すると、ksh93次のことができます。

wget "http://host.example/cgi-bin/script?user1=$(printf '%#H' "$user1")"

perl他のシェルの場合は、URIエスケープを使用できます。

uri_escape() {
  perl -MURI::Escape -le 'print map {uri_escape $_} @ARGV' -- "$@"
}

wget "http://host.example/cgi-bin/script?user1=$(uri_escape "$user1")"

または、curl代わりにwhichを使用してパラメータwgetを直接エンコードします。

curl -G -O --data-urlencode "user1=$user1" 'http://host.example/cgi-bin/script'

答え2

データファイル( 'afile')の内容が次のとおりです。

$ cat afile
now
is
the
time
for
"password": "all good men"
to
come
to
the
aid
of
their
country

次に、Bashの次の行はその行を見つけて、引用符の間に"password":ある内容を抽出します。

$ user1=$(cat afile | grep '^[[:blank:]]*"password"[[:blank:]]*:' | sed 's/^[[:blank:]]*"password":[[:blank:]]*//' | sed 's/"//g')

$ echo $user1
all good men

問題の行が正確に6行にあると確信している場合は、次のことも機能します。

$ user1=$(cat afile | sed '6!d' | sed 's/^[[:blank:]]*"password":[[:blank:]]*//' | sed 's/"//g')

$ echo $user1
all good men

関連情報