
Linux+ の中間試験を受けているのですが、タグを含むヘッド セクションをコピーしてファイルに出力するという問題で行き詰まっています。中間試験は 5 日が期限なので、ヘッド セクションとタグを grep するときに使用する正しいコードを教えていただけると助かります。試してみましたが、ファイルを cat curl www.hackthissite.org: grep "<head> > ~/data/public/myfirstname\ mylastname/head.txt
すると とだけ表示され<head>
、ヘッド セクションやタグは含まれていません。正しい出力をファイルに取得するには、何を入力すればよいのでしょうか。
答え1
それはあなたがやろうとしていることよりも少し複雑です。
まず、コマンドに構文上の問題があります。正しくは次curl www.hackthissite.org: grep "<head> > ~/data/public/myfirstname\ mylastname/head.txt
のようになります。
curl www.hackthissite.org | grep "<head>" > ~/data/public/myfirstname\ mylastname/head.txt
しかし、先頭の開始タグのみを grep し、終了タグとの間にあるものは grep しないので、必要な処理は実行されません。
私はこれを思いつきました:
curl www.hackthissite.org > TEMPORARYFILE.txt; grep -A $(($(grep -n "</head>" TEMPORARYFILE.txt | cut -d: -f1) - $(grep -n "<head>" TEMPORARYFILE.txt | cut -d: -f1))) "<head>" TEMPORARYFILE.txt > ~/data/public/myfirstname\ mylastname/head.txt; rm TEMPORARYFILE.txt
では、部分ごとに見てみましょう。
grep -n "</head>" TEMPORARYFILE.txt | cut -d: -f1
これにより、終了タグがある行の番号が取得されます。grep -n "<head>" TEMPORARYFILE.txt | cut -d: -f1
開始タグの場合も同様です。
次に$(($(grep -n "</head>" TEMPORARYFILE.txt | cut -d: -f1) - $(grep -n "<head>" TEMPORARYFILE.txt | cut -d: -f1)))
、開始タグと終了タグの間に何行あるかを計算する があります。
-A
これは のオプションと一緒に使用されgrep
、一致後の何行目を印刷するかを制御できます。つまり、開始ヘッドタグを検索し、それと終了タグの間にあるすべての行を印刷します。
答え2
gawk を使用する:
curl -s www.hackthissite.org | awk '/<\<head>/,/<\/head>/ {print}'