场景:test.txt文件内容格式如下(IP Port),测试每个IP的连通性。


# cat test.txt 

192.168.116.128 22

192.168.116.129 22

192.168.116.131 22

192.168.116.134 22



实现1:

# cat test.txt | while read ip port; do nc -n -v -z -w 2 $ip $port; done

Connection to 192.168.116.128 22 port [tcp/*] succeeded!

Connection to 192.168.116.129 22 port [tcp/*] succeeded!

Connection to 192.168.116.131 22 port [tcp/*] succeeded!

nc: connect to 192.168.116.134 port 22 (tcp) timed out: Operation now in progress



实现2:

# for i in `cat test.txt | sed 's/ /,/g'`; do eval $(echo $i | awk 'BEGIN{FS=","}{printf("ip=%s;port=%s\n",$1,$2)}'); nc -n -v -z -w 2 $ip $port; done

Connection to 192.168.116.128 22 port [tcp/*] succeeded!

Connection to 192.168.116.129 22 port [tcp/*] succeeded!

Connection to 192.168.116.131 22 port [tcp/*] succeeded!

nc: connect to 192.168.116.134 port 22 (tcp) timed out: Operation now in progress



总结:

可见实现1比较快捷,其主要用到了read,关于read的用法还有挺多,详见man bash。


read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p

prompt] [-t timeout] [-u fd] [name ...]

       One  line  is  read  from  the  standard input, or from the file

       descriptor fd supplied as an argument to the -u option, and  the

       first word is assigned to the first name, the second word to the

       second name, and so on, with leftover words and their  interven-

       ing  separators  assigned  to the last name.  If there are fewer

       words read from the input stream than names, the remaining names

       are  assigned  empty  values.  The characters in IFS are used to

       split the line into words.  The backslash character (\)  may  be

       used  to  remove any special meaning for the next character read

       and for line continuation.  Options, if supplied, have the  fol-

       lowing meanings:

       -a aname

              The words are assigned to sequential indices of the array

              variable aname, starting at 0.  aname is unset before any

              new  values  are  assigned.   Other  name  arguments  are

              ignored.

       -d delim

              The first character of delim is  used  to  terminate  the

              input line, rather than newline.

       -e     If the standard input is coming from a terminal, readline

              (see READLINE above) is used to obtain the  line.   Read-

              line  uses  the  current (or default, if line editing was

              not previously active) editing settings.

       -i text

              If readline is being used  to  read  the  line,  text  is

              placed into the editing buffer before editing begins.

       -n nchars

              read  returns after reading nchars characters rather than

              waiting for a complete line of input, but honor a  delim-

              iter  if fewer than nchars characters are read before the

              delimiter.

       -N nchars

              read returns  after  reading  exactly  nchars  characters

              rather  than waiting for a complete line of input, unless

              EOF is encountered or read times out.  Delimiter  charac-

              ters  encountered  in the input are not treated specially

              and do not cause read to return until  nchars  characters

              are read.

       -p prompt

              Display prompt on standard error, without a trailing new-

              line, before attempting to read any input.  The prompt is

              displayed only if input is coming from a terminal.

       -r     Backslash does not act as an escape character.  The back-

              slash is considered to be part of the line.  In  particu-

              lar,  a  backslash-newline pair may not be used as a line

              continuation.

       -s     Silent mode.  If input is coming from a terminal, charac-

              ters are not echoed.

       -t timeout

              Cause  read  to time out and return failure if a complete

              line of input is not read within timeout seconds.   time-

              out  may  be  a  decimal number with a fractional portion

              following the decimal point.  This option is only  effec-

              tive  if  read is reading input from a terminal, pipe, or

              other special file; it has no effect  when  reading  from

              regular  files.  If timeout is 0, read returns success if

              input is available  on  the  specified  file  descriptor,

              failure  otherwise.   The exit status is greater than 128

              if the timeout is exceeded.

       -u fd  Read input from file descriptor fd.


       If no names are supplied, the line read is assigned to the vari-

       able  REPLY.   The  return  code  is zero, unless end-of-file is

       encountered, read times out (in which case the  return  code  is

       greater  than 128), or an invalid file descriptor is supplied as

       the argument to -u.