bash - Верно, если длина строки (не) равна нулю?

Использовать ssh?

Большинство команд можно выполнить удаленно, просто добавив перед командой ssh , поэтому замените tail -F access.log на ssh REMOTEHOST tail - F access.log ==>

ssh myUSER@myREMOTEHOST tail -F access.log |
awk '{print $8}' |
awk '{gsub("http://|/.*","")}2' | awk '{gsub("http://|:.*","")}1' |
grep -E -v "([0-9]{1,3}\.){3})[0-9]{1,3}" | while read i ;
do 
   nslookup $i $dnsServerIP; 
done > ips.txt

Как намекнули @kasperd и @archemar, вы можете / должны очистить этот длинный конвейер. Вот мой вариант:

ssh myUSER@myREMOTEHOST tail -F access.log |
awk '{$0=$8; gsub("https?://|[/:].*","")} !/([0-9]{1,3}.){1,3}[0-9]{1,3}/' |
while read i ; do
    nslookup $i $dnsServerIP; 
done > ips.txt

Пояснение:

  • $ 0 = $ 8 . В вашем примере выходных данных столбец с нужным URL-адресом имеет номер 8. Эта команда перезаписывает $ 0 (всю строку) только элементом $ 8 , эффективно отбрасывая остальные. Это заменяет '{print $ 8}'

  • gsub ("https?: // | [/:]. *", "")} заменяет оба ваших gsub-вызова одним, охватывающим все возможности в одной. В вашем коде вы также дважды искали «http: //» и не нашли совпадения с http s .

  • ! / ([0-9] {1,3}.) {1,3} [0-9] {1,3} / ' заменяет ваш отдельный вызов grep с использованием того же регулярного выражения. Он принимает значение true, когда $ 0 не является числовым IP-адресом, и будет неявно {print $ 0} '. Немного короче h = $ 0; gsub (/ [0-9.] /, "", H)} h имеет тот же эффект.

Примечание. Завершающие 2 и 1 за } за вашим gsub -вызовы оцениваются как истина , который, в свою очередь, неявно расширяется до true {print $ 0} . Вот как / почему последнее регулярное выражение в моем решении неявно печатает несоответствующую строку.

4
23.05.2018, 22:43
2 ответа

[.. ]sigue las mismas reglas que todos los demás comandos, es decir, se aplica División de palabras . Si OUTestá vacío (o no está configurado ), $OUTse expandirá a nada, ni siquiera a un argumento vacío.

Entonces, [ -n $OUT ]se expande a [, -ny ], y [prueba si -nno es una cadena vacía. Está,por lo que la prueba devuelve verdadero.

Tienes que citar $OUT, como casi en todas partes:

if [ -n "$OUT" ]; then...

Véase:¿Cuándo es necesario -cotizar dos veces? y Pruebas y condicionales en BashGuide.

14
27.01.2020, 20:47

El comando

[ -z $OUT ]

es exactamente equivalente a

test -z $OUT

que, si $OUTestá vacío, es lo mismo que

test -z

El comportamiento detestdepende de la cantidad de parámetros proporcionados en la línea de comando. Si se proporciona un solo parámetro, como en test -no test -z, el resultado será "verdadero" si la longitud de ese parámetro, cuando se interpreta como una cadena, no es -cero.

Esto significa que si $OUTestá vacío y sin comillas, entonces test -z $OUTy test -n $OUTserán verdaderos porque -zy -nson ​​cadenas de longitud distinta de -cero.

Para remediar esto, doble -cita la expansión variable:

[ -n "$OUT" ]

Véase también

4
27.01.2020, 20:47

Теги

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