首页 > 代码库 > linux中重定向学习总结

linux中重定向学习总结

  文件标识符是从0到9结束的整数,指明了与进程有关的特定数据流源。当Linux系统启动一个进程(该进程可能用于执行Shell命令)时,将自动为该进程打开三个文件:标准输入、标准输出和标准错误输出,分别由文件标识符0、1、2标识,如果进程要打开其他的输入和输出文件,则从3开始标识。另外3-9是保留的标识符,可以把这些标识符指定为标准输入、标准输出和标准错误输出的临时连接。通常这样可以解决好多复杂的重定向请求。
  下面举一些由管道符连接的重定向的例子:
  1.ls -l | sed -n ‘1,5p‘--列出当前目录的子目录或文件,并由sed命令打印前五个目录或文件
  2.more /etc/passwd | sed -n ‘/root/p‘ --查看passwd文件的内容,并由sed匹配文件中包含root字符串的行
  3.more /etc/passwd | sed -n ‘/root/p‘ | sed -n ‘/login/p‘ --查看以root登录的用户
  4.var1="Hello world"
   var2="Beijing"
   echo $var1 | sed "s/world/$var2/g" --输出将var1中的world替换为var2对应的值的内容(这里不能使用单引号,因为它不能进行变量引用)
  5.var1="Hello world"
   echo $var1|awk ‘{print length($0)}‘ --输出变量的长度
  6.var1="Hello world"
   echo $var1 | awk ‘print length($1)‘ --输出变量中第一个域的长度
  7.var1."Hello world"
      echo $var1 | awk ‘{print substr($0,1,5)}‘ --输出变量中的1至5个子字符串
    echo $var1 | awk ‘{print substr($0,7)}‘ --输出变量中从第七个字符串开始的子字符串
  8.awk -F ‘:‘ ‘{print $1 | "sort"}‘ /etc/passwd --文件passwd中的内容以冒号作为分隔符,打印第一个经过排序的域
  9.awk ‘BEGIN{while (("ls /usr" | getline d)>0) print d}‘ --命令执行结果通过getline方式获取,并传给变量d,如果变量d的值存在,就打印该值
  10.who | tee /tmp/who.sh  --将当前用户信息通过tee重定向到who.sh文件中,这里可以通过tee -a追加内容到文件中。
IO重定向符号意义
  cmd1 | cmd2 --cmd1的输出作为cmd2的输入
  >filename --将输出写入到filename
  <filename --将文件内容读入到标准输入中
  >>filename --将输出写入到filename,如果文件有内容,将会以追加形式写入
  >| filename --覆盖filename的内容
  n > filename --将标识符为n的内容写入到filename
  n < filename --将文件内容读入到标识符n中
  n >> filename --将标识符n追加到filename中
  例子:
    cat > filename --以标准输入方式编辑文件的内容,直到ctrl+d结束
    ls -l | grep ".*.sh" >> filename --将搜索到符合扩展名为rc的文件名追加到filename中
    ls -l | grep ".*.sh" >| filename --强制覆盖内容
    ls -l z* 2>filename 假设当前目录没有以z开头的文件,将标准错误输出重定向到filename中
 
代码块重定向是指在代码块内将标准输入或标准输出重定向到文件,而在代码块之外还是保留默认状态。
代码块输入重定向符号是<,输出重定向符号是>。
例子.while代码块:
#!/bin/bash
#将ls /etc的结果写到a.txt文件中
ls /etc > a.txt
#搜索a.txt文件中与rc.d所匹配的行,输出匹配行的行数
  while [ "$filename" != "rc.d" ]
  do
  #按行读取a.txt内容
  read filename
  let "count"+=1
  done < a.txt
  echo "$count times read"
  #测试循环体外面的标准输入是否被重定向
  echo -n "---------Pls.Input Data:---------"
  read test
  echo $test
例子.for代码块
  #!/bin/bash
  #将ls /etc的结果写到a.txt文件中
  ls /etc >a.txt
  #计算a.txt文件的最大行数,并赋给maxline变量
  maxline=$(wc -l < a.txt)
  for filename in `seq $maxline` #利用seq产生循环参数
  do
  read filename
  #for 循环中需要有if语句指定跳出循环的条件
  if [ "$filename" = "rc.d" ]
  then
  break
  else
  let "count+=1"
  fi
  done < a.txt #将输入内容复制到文件a.txt
  echo "$count times read"
  #测试循环体外面的标准输入是否被重定向
  echo -n "----Pls. Input Data:----"
  read test
  echo $test
  shell中eval的使用情况:
  如果变量中包含任何需要Shell直接在命令中看到的字符,就需要使用eval命令。命令结束符(;,|,&)、IO重定向符(<,>)和引号这些对Shell具有特殊意义的符号,必须直接出现在命令行中。
  例子:
    #!/bin/bash
    #NAME变量保存每行的第1列,VALUE变量保存每行的第2列
    while read NAME VALUE
    do
    eval "${NAME}=${VALUE}"
  done < evalsource.sh
  #测试变量的值
  echo "var1=$var1"
  echo "var2=$var2"
  echo "var3=$var3"
 

linux中重定向学习总结