linux文件目录高级操作

文件目录高级操作
知识要点
输入输出重定向
管道及相关配套命令
数据提取及过滤
文件差异对比
1、输入输出重定向
标准输入和标准输出
标准输入(stdin)和标准输出(stdout)
交互式硬件设备
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息
PCB:记录打开了哪些文件,下面三个默认打开
类型
设备文件
文件描述符(fd)
默认设备
标准输入
/dev/stdin
0
键盘
标准输出
/dev/stdout
1
显示器
标准错误输出
/dev/stderr
2
显示器
改变标准输入、标准输出的方向就是重定向
正确输出
例如:cat命令
[root@localhost ~]# cat 1  //手动输入 1  //自动输出
类型
操作符
用途
重定向标准输出
>
将命令的执行结果输出到指定的文件中,而不是直接显示在屏幕上 
>>
将命令执行的结果追加输出到指定文件 
重定向标准输入
<
将命令中接收输入的途径由默认的键盘更改为指定的文件 
错误输出
标准错误:通过该设备报告执行出错信息
[root@localhost tmp]# llll 2>> error.txt
类型
操作符
重定向标准错误
2>
2>>
重定向标准输出和标准错误到同一个文件
2>&1 或者>&或者 &>
重定向标准输出和标准错误到不同文件
> 文件1  2 >文件2
两个特殊文件
/dev/null:过滤标准错误信息               (黑洞文件)
/dev/zero:用来创建指定长度文件       产生0
2、管道及相关配套命令
echo命令
echo(默认换行)
用途:在屏幕上显示一段文字或指定内容。
格式:echo  [-n] 字符串(输出之后不换行)
echo [-e]
[root@localhost tmp]# echo DatabaseAdmin DatabaseAdmin
/*  ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------                                                                                                                                                                                                                                               
linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法
echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。
一般格式: echo [ -n ] “字符串”
其中选项n表示输出文字后不换行;字符串能加引号,也能不加引号。但是为了减少以后编写脚本的出错机率,统一加上引号。
功能说明:显示文字。
语   法:echo [-ne][字符串]或 echo [--help][--version]
补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开, 并在最后加上换行号。
参   数
-n 不要在最后自动换行
-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般
文字输出
   a 发出警告声;
    删除前一个字符;
   c 最后不加上换行符号;
   f 换行但光标仍旧停留在原来的位置;
     换行且光标移至行首;
     光标移至行首,但不换行;
     插入tab;
   v 与f相同;
   \ 插入字符;
    nn 插入nnn(八进制)所代表的ASCII字符;
–help 显示帮助
–version 显示版本信息
echo显示带颜色,需要使用参数-e
格式如下:
echo -e "33[字背景颜色;文字颜色m字符串33[0m"
例如: 
echo -e "33[41;37m TonyZhang 33[0m"
其中41的位置代表底色, 37的位置是代表字的颜色
 注:
1、字背景颜色和文字颜色之间是英文的“""”
2、文字颜色后面有个m
3、字符串前后可以没有空格,如果有的话,输出也是同样有空格
下面看几个例子:
echo -e "33[30m 黑色字 33[0m"
echo -e "33[31m 红色字 33[0m"
echo -e "33[32m 绿色字 33[0m"
echo -e "33[33m 黄色字 33[0m"
echo -e "33[34m 蓝色字 33[0m"
echo -e "33[35m 紫色字 33[0m"
echo -e "33[36m 天蓝字 33[0m"
echo -e "33[37m 白色字 33[0m" 
echo -e "33[40;37m 黑底白字 33[0m"
echo -e "33[41;37m 红底白字 33[0m"
echo -e "33[42;37m 绿底白字 33[0m"
echo -e "33[43;37m 黄底白字 33[0m"
echo -e "33[44;37m 蓝底白字 33[0m"
echo -e "33[45;37m 紫底白字 33[0m"
echo -e "33[46;37m 天蓝底白字 33[0m"
echo -e "33[47;30m 白底黑字 33[0m"
控制选项说明 :
33[0m 关闭所有属性 
33[1m 设置高亮度 
33[4m 下划线 
33[5m 闪烁 
33[7m 反显 
33[8m 消隐 
33[30m -- 33[37m 设置前景色 
33[40m -- 33[47m 设置背景色 
33[nA 光标上移n行 
33[nB 光标下移n行 
33[nC 光标右移n行 
33[nD 光标左移n行 
33[y;xH设置光标位置 
33[2J 清屏 
33[K 清除从光标到行尾的内容 
33[s 保存光标位置 
33[u 恢复光标位置 
33[?25l 隐藏光标 
33[?25h 显示光标
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/                                                                                                                                                                                                                                                      
数据过滤
grep数据提取程序
用途:在文件中查找并显示包含指定字符串的行
格式:grep  [选项]...  模式  目标文件
-i:查找时忽略大小写(Linux区分大小写)
-v:反转查找,输出与模式不相符的行 
-w:按整字查找
-n:显示符合模式要求的行号
-r:递归搜索所有文件
固定模式:正则表达式
模式
^….:以什么开头
…..$:以什么结尾
管道
管道操作符号“|”   
作用:连接左右两个命令,
功能:将左侧的命令的标准输出作为右侧命令的标准输入
使用前提:
1、左边的命令要有标准的输出
2、右边的命令要有支持标准输入
格式:cmd1  |  cmd2  [... | cmdn]
head -5 /etc/passwd | tail -1
用grep 过滤输出
ls –l /etc | grep pass
[root@localhost tmp]# grep "abc"          //检测“abc” 123 abc     //输入 123 abc     //自动输出 123         //输入(无abc) 不输出
管道和标准错误
find /etc –name “p*” | grep passwd  find /etc –name “p*” | grep passwd > /tmp/aa find /etc –name “p*” | grep passwd 2> /tmp/aa find /etc –name “p*” | grep passwd &> /tmp/aa find /etc –name “p*” 2>/dev/null | grep passwd   //先屏蔽在过滤
下列哪些命令可以同时显示出aa和bb两个文件的内容
×   cat aa | cat bb  
×   cat aa ; bb
×   cat aa ; cat > bb        //输出重定向了
×   cat < aa ; echo bb   //前面可以
×   cat aa bb | cat 
×   cat  aa bb > abc        //输出重定向了
   cat < aa ; cat < bb
   cat aa bb > /dev/stdout
   cat aa bb > /dev/stderr
xargs命令转换
xargs   配合管道使用,管道前的标准输出转换成后面的参数,形成新的命令行
用途:将参数列表转换成小块分段传递给其他命令
读入stdin的数据转换为参数添加到命令行中
让一些不支持管道的命令可以使用管道
[root@server ~]# which useradd | ls -lh -rw-r--r-- 1 root root  27K 01-08 16:07 install.log -rw-r--r-- 1 root root 3.6K 01-08 16:05 install.log.syslog [root@server ~]# which useradd | xargs ls -lh -rwxr-x--- 1 root root 73K 2009-11-27 /usr/sbin/useradd [root@server ~]# find /boot -size +1M | xargs file /boot/initrd-2.6.18-194.el5.img: gzip compressed data, from Unix, last modified: Sun Jan  8 15:57:44 2012, max compression /boot/vmlinuz-2.6.18-194.el5:    ELF 32-bit LSB shared object, Intel 80386, version 1, stripped
seq命令打印有序数字
seq
用途:打印出一串有序的数字
格式:seq  [选项]  数字范围
-s:指定分隔符
-w:指定同等宽度
[root@localhost ~]# seq  -s "+" 25 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25 [root@localhost ~]# seq  -s "+" 25 | bc 325
tr命令字符转换
tr命令
字符转换工具
不能直接对文件操作
使用tr转换字符
tr  SET1  SET2 (数量一致)
用SET2中的字符替换掉SET1中同一位置的字符
[root@localhost ~]# echo 123456 | tr 345 abc 12abc6
tr 123 abc < aa
tr ‘[a-z]’ ‘[A-Z]’ < /etc/hosts
使用tr删除字符
tr  -d SET
删除与SET相同的字符
[root@localhost ~]# echo 123456 | tr -d 345  126
 tr -d '[0-9]’ < /etc/hosts (删除数字)
echo “Tom, I hear a pig!” | tr -d '[a-z]'    (删除字母)
使用tr压缩字符
tr  -s SET
将连续相同的字符压缩成一个字符
[root@localhost ~]# echo 112233444555666 | tr -s 345 1122345666
tr  -s SET1 SET2
先替换为SET2再压缩
[root@localhost ~]# echo 112233444555666 | tr -s 345 abc 1122abc666
[root@localhost ~]# echo 112233444555666 | tr 345 abc | tr -s abc 1122abc666
 sort命令排序
sort命令(排序)
默认按每行的第一个字符排序(不管数值大小)
-n:按整数进行排序
-r:递减排序
指定排序键
指定按哪一列数据进行排序
-k:指定哪一列为排序键
cat tt | sort -n -k4
指定字段分隔符
-t:指定字段分割符(默认是空格)
sort -t: -n -k3 /etc/passwd 
uniq命令去重
uniq命令(唯一,去重)
通常和sort连用,删除经过排序后的数据的重复记录
[root@localhost ~]# cat a123 |sort | uniq
sort -n tt | uniq
数据的实例统计
-c:显示文件中每行连续出现的次数 
cat tt | uniq -c
-u:只显示不重复的行
cat tt | uniq –u
-d:只显示重复的行
cat tt | uniq -d
cut命令数据提取
从文本文件或者文本流中提取文本列
cut -选项  提取范围   文本文件
常见选项
-c:从指定提取范围中提取字符
-f:从指定提取范围中提取字段
提取范围
n:第n项
n-:第n项到行尾
-m:行首到第m项
n,m:第n项和第m项
n-m:第n项到第m项
cut -c命令
[root@localhost ~]# echo $RANDOM | md5sum | cut -c 1-10 //随机生成10个字符 88f415ef09
ls -l | cut -c 10
who | cut -c 20-40
cut -c -10 /etc/passwd
cut -f命令
-d:指定分隔符默认是Tab
cut -d “:” -f 1,7 /etc/passwd
who | cut  -d '  '  -f1,6
wc命令字数统计
wc(字数统计)命令
格式:wc  [选项]...  目标文件...
-l:统计行数
-w:统计字数 (前后都是空白的一组字符)
-c:统计字符数(可见和不可见的字符
[root@localhost ~]# wc install.log   650  1309 28534 install.log //行    字   字符
3、文本差异对比diff
diff命令
比较两个文件之间的差异
输出结果为两个文件的不同之处
练习
练习一:
只显示/etc/fstab文件的第三行
将/etc/fstab文件的第6行,保存到/tmp/a.txt
将/etc/fstab文件的第2和3行,追加保存到/tmp/a.txt
只显示/etc/fstab文件的第三列
用du -a只显示/boot目录下对象的占用空间,并按由小到大排序
获取所有用户名(/etc/passwd中的第一列,以:分隔)
获取主机IP
设置密码时,自动输入用户密码
//只显示/etc/fstab文件的第三行 [root@localhost ~]#  head -3 /etc/fstab|tail -1 # /etc/fstab //将/etc/fstab文件的第6行,保存到/tmp/a.txt [root@localhost ~]# head -6 /etc/fstab | tail -1 | cat >>/tmp/a.txt [root@localhost ~]# cat /tmp/a.txt  # Accessible filesystems, by reference, are maintained under '/dev/disk' //将/etc/fstab文件的第2和3行,追加保存到/tmp/a.txt [root@localhost ~]# head -3 /etc/fstab | tail -2 | cat >>/tmp/a.txt [root@localhost ~]# cat /tmp/a.txt  # Accessible filesystems, by reference, are maintained under '/dev/disk' # # /etc/fstab //只显示/etc/fstab文件的第三列 [root@localhost ~]# cut -d " " -f 3 /etc/fstab # by # filesystems, man # //用du -a只显示/boot目录下对象的占用空间,并按由小到大排序 [root@localhost ~]# du -a /boot|sort -n -k1 1 /boot/grub/menu.lst 2 /boot/grub/device.map 2 /boot/grub/grub.conf 2 /boot/grub/stage1 2 /boot/.vmlinuz-2.6.32-642.el6.x86_64.hmac 3 /boot/grub/splash.xpm.gz 13 /boot/grub/ffs_stage1_5 13 /boot/grub/iso9660_stage1_5 13 /boot/grub/minix_stage1_5 13 /boot/grub/ufs2_stage1_5 13 /boot/grub/vstafs_stage1_5 13 /boot/lost+found 14 /boot/grub/fat_stage1_5 14 /boot/grub/jfs_stage1_5 15 /boot/grub/e2fs_stage1_5 15 /boot/grub/xfs_stage1_5 16 /boot/grub/reiserfs_stage1_5 107 /boot/config-2.6.32-642.el6.x86_64 125 /boot/grub/stage2 212 /boot/symvers-2.6.32-642.el6.x86_64.gz 250 /boot/efi/EFI/redhat/grub.efi 252 /boot/efi/EFI/redhat 254 /boot/efi/EFI 256 /boot/efi 276 /boot/grub 2555 /boot/System.map-2.6.32-642.el6.x86_64 4166 /boot/vmlinuz-2.6.32-642.el6.x86_64 4918 /boot/initrd-2.6.32-642.el6.x86_64kdump.img 24671 /boot/initramfs-2.6.32-642.el6.x86_64.img 37178 /boot //获取所有用户名(/etc/passwd中的第一列,以:分隔) [root@localhost ~]# cut -d ":" -f1 /etc/passwd root bin daemon adm lp sync shutdown halt mail uucp operator games gopher ftp nobody dbus rpc vcsa abrt rpcuser nfsnobody haldaemon ntp saslauth postfix sshd oprofile tcpdump b200 a200 hbase qq haha xixi u1 qq //获取主机IP [root@localhost ~]# ifconfig |head -2|tail -1|cut -d ":" -f2|cut -d " " -f1 172.16.66.66 设置密码时,自动输入用户密码
练习二:
先创建用户roota,再只提取root用户的信息
统计以root开头的用户有多少(root除外)
提取root用户的家目录
统计所有登录shell为/sbin/nologin的用户数量
//先创建用户roota,再只提取root用户的信息 [root@localhost ~]# useradd roota //统计以root开头的用户有多少(root除外) [root@localhost ~]# cut -d ":" -f 1 /etc/passwd|grep roo|sort|uniq -c       1 root       1 roota [root@localhost ~]# cut -d ":" -f 1 /etc/passwd|grep roo|sort|uniq -c|wc -l 2 //提取root用户的家目录 [root@localhost ~]# cat /etc/passwd |grep "^root"|grep -w "root"|cut -d ":" -f6 /root //统计所有登录shell为/sbin/nologin的用户数量 [root@localhost ~]# cat /etc/passwd |grep "/sbin/nologin$"|grep -w "/sbin/nologin"|cut -d ":" -f1|wc -l 25
原文地址:https://www.cnblogs.com/qluzzh/p/10306115.html