Para imprimir o endereço logo após src
(supondo que todas as partes relevantes permaneçam na mesma linha ...):
ip route get 1 | sed 's/^.*src \([^ ]*\).*$//;q'
Estou tentando extrair o endereço IP local usando um comando de plataforma cruzada. Até hoje, eu estava usando este comando:
ip route get 1 | awk '{print $NF;exit}'
Mas no Fedora 27 não está funcionando porque a saída de ip route get 1
é:
0.0.0.1 via 192.168.1.1 dev en1 src 192.168.0.229 uid 1000
cache
Estou recebendo 1000
como o endereço IP. Em todos os outros sistemas que tentei, a saída sempre foi:
0.0.0.1 via 192.168.1.1 dev en1 src 192.168.0.229
Eu também tentei usar este comando com o mesmo resultado:
ip route get 255.255.255.255 | sed -n '/src/ s/.*src //p'
Eu não sou um especialista usando awk
ou sed
espero que você possa me ajudar.
Obrigado!
Talvez não seja o que você está procurando, basicamente porque eu trabalho com ifconfig
e não com a nova forma de comando ip
para conseguir o que eu quero. Mesmo assim, deixo-vos um pedaço do script que escrevi há quase um ano para obter, entre outras coisas, o IP. Sinta-se à vontade para modificá-lo como desejar. Está escrito em Perl e funciona, sem problemas, no Debian 8 (Jessie).
#!/usr/bin/perl -w
use strict; # strict style
use warnings; # activate warnings
use diagnostics; # diagnostic failover
use 5.010;
no warnings 'experimental';
if (!@ARGV) {
print "\nPlease enter the interface name. ie: etho, wlan0, bond0...\n\n";
exit();
}
# This piece is for avoid misspelling or other things
if ($ARGV[0] =~ s/[\$#;@~!&*()\[\];.,:?^ '\\/]+//g) {
print "\nWhat are you trying?\n\n";
exit();
}
my $sentence = "ifconfig " . $ARGV[0];
my @ethernet = '$sentence ';
my $length = scalar @ethernet;
for (my $i = 0; $i < $length; $i++) {
given ($i) {
#MAC address
if ($i == 0) {
if ($ethernet[$i] =~ /([0-9A-Fa-f][0-9A-Fa-f]([:-])[0-9A-Fa-f][0-9A-Fa-f]([0-9A-Fa-f][0-9A-Fa-f]){4})/ ) {
my $mac_address = $1;
print "The MAC address of $ARGV[0] is $mac_address\n";
} break;}
#IP address
if ($i == 1) {
if($ethernet[$i] =~ /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/ ){
my $ip_address = $1;
print "The IP address of $ARGV[0] is $ip_address\n";
} break;}
#MTU
if ($i == 3) {
if ($ethernet[$i] =~ /MTU:([^\sB]*)/ ) {
my $mtu = $1;
print "The MTU of $ARGV[0] is $mtu\n";
}; break;}
#Recieved package
if ($i == 4) {
if ($ethernet[$i] =~ /RX packets:([^\sB]*)/ ) {
my $rx_pckg = $1;
print "The amount of Recieved Package in $ARGV[0] is $rx_pckg\n";
}; break;}
#Transmited package
if ($i == 5) {
if ($ethernet[$i] =~ /TX packets:([^\sB]*)/ ) {
my $tx_pckg = $1;
print "The amount of Transmited Package in $ARGV[0] is $tx_pckg\n";
}; break;}
#Number of collisions
if ($i == 6) {
if ($ethernet[$i] =~ /collisions:([^\sB]*)/ ) {
my $collisions = $1;
print "The number of collisions in $ARGV[0] is $collisions\n";
}; break;}
#Total RX and TX in MB and GiB
if ($i == 7) {
if ($ethernet[$i] =~ /RX bytes:([^\sB]*)/ ) {
my $rx_total_byte = $1;
my $rx_total_mega = $rx_total_byte / 1048576;
my $rx_total_giga = $rx_total_mega / 1024;
print "The total amount of RecievedPackets in $ARGV[0] is $rx_total_mega Mb / $rx_total_giga GiB\n";
}
if ($ethernet[$i] =~ /TX bytes:([^\sB]*)/ ) {
my $tx_total_byte = $1;
my $tx_total_mega = $tx_total_byte / 1048576;
my $tx_total_giga = $tx_total_mega / 1024;
print "The total amount of RecievedPackets in $ARGV[0] is $tx_total_mega Mb / $tx_total_giga GiB\n";
}; break;}
}
}
Tente isso
ip route get 1 | awk '{print $7}'
Tags ip awk sed shell-script