Как выполнить grep (Select-String) в выводе команды curl (Invoke-WebRequest) в PowerShell

Я пытаюсь скрутить веб-сайт и найти на нем указанную строку в PowerShell. Как я могу это сделать?

Вот эквивалент того, что я пытаюсь сделать, но в BASH

user@host:~$ curl -s www.isxkcdshittytoday.com | grep YES
title="YES">YES</a>
user@host:~$ 

Но когда я делаю то, что, как я ожидал, будет эквивалентным в PowerShell, я получаю полный ответ - не только то, что соответствует моему выражению sls (grep)

PS C:\Users\user> curl -UseBasicParsing isxkcdshittytoday.com | sls -ca YES

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Is xkcd shitty today?</title>
<link rel="alternate" title="Is xkcd shitty today?" href="rss.xml" type="application/rss+xml" />

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-26584170-2', 'isxkcdshittytoday.com');
  ga('send', 'pageview');
</script>

</head>

<body style="text-align: center; padding-top: 200px;">

<a href="rss.xml" style="font-weight: bold; font-size: 120pt;
font-family: Arial, sans-serif; text-decoration: none; color: black;"
title="YES">YES</a>

</body>
</html>



PS C:\Users\user>

Почему приведенная выше команда в PowerShell не работает должным образом? Как передать что-то из curl в sls в качестве альтернативы grep в PowerShell?

-1
задан 14 September 2020 в 22:31
1 ответ

Похоже, Select-String совсем не понимает концепцию "линий".

Решение состоит в том, чтобы разбить текст на массив фактических строк, а затем использовать для них Select-String:

$r = Invoke-WebRequest www.isxkcdshittytoday.com
$lines = $r.Content.Split([Environment]::NewLine)
$lines | Select-String 'yes'

или, в одной строке и с ярлыками-псевдонимами:

(curl www.isxkcdshittytoday.com).Content.Split([Environment]::NewLine) | sls 'yes'

Обратите внимание, что в PowerShell curl — это псевдоним для Invoke-WebRequest, который возвращает сложный объект типа HtmlWebResponseObject; чтобы получить фактический текст ответа, вам нужно посмотреть на атрибут Content, который вместо этого является строкой (и поэтому может быть разделен); ваш пример работает только из-за неявного преобразования строк.

Пожалуйста, также обратите внимание, что разбить текст на строки не так просто, как кажется.

2
ответ дан 14 September 2020 в 19:18

Теги

Похожие вопросы