重定向和管道符
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