重定向和管道符

1.重定向 --> 标准输入、标准输出、错误输入
在程序中,数据如何输入?又如何输出?
数据输入:键盘 -- 标准输入,但是并不是唯一输入方式;
  --stdin
  echo "123456"|passwd --stdin "username"
  例如:功能添加用户,useradd.sh user.txt文本文档1000个用户
    执行./useradd.sh
    ./useradd < user.txt
  while line ;do
    循环体 $line
  done < /etc/passwd
数据输出:显示器 -- 标准输出,但是并不是唯一输出方式
  ls /etc/ > a.txt
fd文件标识符0-9 -- 相当于给文件分类
  0 -- 标准输出
  1 -- 标准输入
  2 -- 标准输入输出(标准错误)
常见重定向符号
  1.标准输出
    > 覆盖重定向-->非常危险
      set -C --> 关闭覆盖重定向功能
      set +C --> 开启覆盖重定向功能
      >| 强制重定向
    >> 追加重定向 --> 不覆盖
  2.标准输入
    < tr -- 替换文件内容
      tr abc ABC < /etc/passwd --> 把passwd文件里的abc替换为ABC
    << 将多行数据同时输入
      cat >>a.txt<< EOF
  3.错误输出
    2> 追加
    扩展:不需要输出内容,只需要输出状态;
      ls /etc/ > /dev/null
      if [$? -eq 0];then
        循环体
      fi
    2>> 追加
    &> &>> == 2&>1
      ls /etc/ &> /dev/null
cat a.txt | more
2.管道-tee
command1|command2|command3|……
前一个命令执行结果交给后一个命令来执行
【Linux思想:结合小功能实现大功能】
free -m|grep "^Men"|cut -d'' -f19
free -m|grep "^Men"|awk '{print $3}'
find [范围] -name ab* -type f -perm 600 -mtime +7|xargs rm -rf
-f 列数/个数
tee --> 一路输入,两路输出
  tee /tmp/tee.out
  如果没有文件,会创建,默认如果文件存在有内容,会覆盖
练习:
将/etc/passwd文件中的前5行内容转换为大写后保存至/tmp/passwd.out文件中;
    head -5 /etc/passwd|tr [a-z] [A-Z] > /tmp/passwd.out
将登录至将前系统上用户信息汇总后的3位信息转换为大写后保存至/tmp/who.out文件中
    who |tail -3|cut -d'' -f1|tr [[:lower:]] [[:upper:]]|tee /tmp/who.out
tail 查看文件尾部多少行(默认10行)
3.文本处理工具--wc,cut,sort,uniq
wc---word count(统计文本文件中的字符个数)
  用法:wc -c filename 看文件大小
    -l 看行数
    -w 看字符个数
cut
  用来做文件分割
    -d 指定分隔符(delimiter)
    -f 指定输出的列数
    f2 第二列
    f1-3 1-3列
    f1,3 1,3列
    --output-delemiter=' ' 将输出的分隔符替换为自己想用的分隔符

  [cut的局限性1.-d指定分隔符,不能同时指定多个 2.不能做高级的格式化输出。所以需要熟练掌握awk]
sort
  排序(根据ASCII码进行排序,大小写不是),默认查看第一个字符(包括数字字母以及空格和特殊符号)
    -t 指定分隔符
    -r 逆序
    -f 忽略字符的大小写
    -n 指定以数值大小进行排序
    -u uniq 排序去除重复,重复的不显示
    -k 指定按照那一列进行排序
uniq
    去重,连续且相同的命令才被视为重复
    建议先排序后去重
    -c 统计某些字符重复了多少次
    sort filename | uniq -c
    -d

posted @ 2019-08-13 19:10  |李先生|  阅读(196)  评论(0编辑  收藏  举报