Использовать 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}
. Вот как / почему последнее регулярное выражение в моем решении неявно печатает несоответствующую строку.
[.. ]
sigue las mismas reglas que todos los demás comandos, es decir, se aplica División de palabras . Si OUT
está vacío (o no está configurado ), $OUT
se expandirá a nada, ni siquiera a un argumento vacío.
Entonces, [ -n $OUT ]
se expande a [
, -n
y ]
, y [
prueba si -n
no 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.
El comando
[ -z $OUT ]
es exactamente equivalente a
test -z $OUT
que, si $OUT
está vacío, es lo mismo que
test -z
El comportamiento detest
depende de la cantidad de parámetros proporcionados en la línea de comando. Si se proporciona un solo parámetro, como en test -n
o 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 $OUT
está vacío y sin comillas, entonces test -z $OUT
y test -n $OUT
serán verdaderos porque -z
y -n
son cadenas de longitud distinta de -cero.
Para remediar esto, doble -cita la expansión variable:
[ -n "$OUT" ]
Véase también