• 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"
     
  • 相关阅读:
    ShellExecuteEx 函数说明
    npm
    Byte和char
    如何高效阅读一个项目
    C++中慎用malloc
    #ifdef
    string
    C++与C混合编译
    git@github.com: Permission denied (publickey).
    connect to host github.com port 22: Connection refused
  • 原文地址:https://www.cnblogs.com/confident1012/p/6323738.html
Copyright © 2020-2023  润新知