高级文件操作 (一)

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 高级文件操作 (一)

输入输出的介绍#


标准输入(stdin) : 从该设配接受用户输入的数据

标准输出(stdout) : 通过该设备向用户输入数据

标准错误: 通过该设备报告执行出错信息


类型 设备文件 文件描述符 默认设备
标准输入 /dev/stdin 0 键盘
标准输出 /dev/stdout 1 显示器
标准错误输出 /dev/stderr 2 显示器


输入输出重定向#


通过命令,改变了标准输入输出的方向就是重定向

类型 | 操作符 | 用途

---|------|------|---

重定向标准输出| >| 将命令执行的结果,重定向输入的指定的文件中,而不再是显示屏

重定向标准输出| >> |将命令执行的结果追加到指定的文件中

重定向标准输入|< |将命令中接受到的路径,由默认的键盘,更改为指定的文件


例: 将abc.log的内容当成输入,重定向作为cat的输出


cat < abc.log


标准错误: 通过该设备报告执行出错信息


类型 操作符
重定向标准错误 2>
重定向标准错误 2>>
重定向标准输出 和 标准错误 2>&1 或者 >& 或 &>
重定向标准输出 和 标准错误 到不同的文件 >文件1 2>文件2


其中的2是标识符号


例: 将标准输出和标准错误重定向到不同的文件


ls a.txt aaaa > /dev/null 2>err.txt
如果目标文件是不存在的,会被自动创建出来


例: 将标准输出和标准错误重定向相同的文件


ls a.txt aaaa > /dev/null 2>&1  
如果目标文件是不存在的,会被自动创建出来
1是可以省略的


两个特殊的文件

  • /dev/null 黑洞文件,传递进去的任何文件都会被当成垃圾丢弃
  • /dev/zero 用来创建指定长度的文件,不指定就是空文件


其他命令#


echo#


在屏幕上显示一段指定的文件或者内容

echo [-n] 字符串

-n: 不会进行换行


[root@ecs-t6-large-2-linux-20190824103606 ~]# echo 123
123
[root@ecs-t6-large-2-linux-20190824103606 ~]# echo -n 123
123[root@ecs-t6-large-2-linux-20190824103606 ~]#


管道及相关配套命令#


操作符#


一条竖线 |


作用#


连接左右两个命令,将左侧命令的标准输出,作为右侧命令的标准输入

有约束: 左侧命令要支持标准输出, 右侧命令会支持标准输入

格式:


cmd1 | cmd2 | cmd3
出         出入       入 
cmd1的标准输出  被cmd2当成标准输入使用,  cmd2的标准输出被cmd3当成标准输入使用


例: 过滤出 /etc/下包含 pass的行


[root@ecs-t6-large-2-linux-20190824103606 ~]# ls -l /etc | grep pass
-rw-r--r--   1 root root   1092 Sep  8 20:32 passwd
-rw-r--r--.  1 root root   1135 Sep  8 20:29 passwd-


xargs参数#


用途: 让一些不支持管道的操作的命令行,可以使用管道


例1:


查看useradd命令所在的位置
[root@ecs-t6-large-2-linux-20190824103606 ~]# which useradd
/usr/sbin/useradd
管道的右边不支持标准输入, 所以它是在对当前目录使用 ls -lh
[root@ecs-t6-large-2-linux-20190824103606 ~]# which useradd | ls -lh
total 0
使用xargs 将左边的标准输入作为参数,添加的右侧的命令中
[root@ecs-t6-large-2-linux-20190824103606 ~]# which useradd |xargs ls -lh
-rwxr-x--- 1 root root 116K Mar 14 18:35 /usr/sbin/useradd


例2 可以实现分批删除:


find 200个文件 | args rm -f


seq#


作用: 打印出一串有序的数字

格式: seq [选项] [范围]

  • -s:指定分隔符
  • -w:指定同等宽度


例:


[root@ecs-t6-large-2-linux-20190824103606 ~]# seq 3
1
2
3
[root@ecs-t6-large-2-linux-20190824103606 ~]# seq 2 3
2
3
[root@ecs-t6-large-2-linux-20190824103606 ~]# seq 5 2 10
5
7
9
[root@ecs-t6-large-2-linux-20190824103606 ~]# seq 1 -1 10
[root@ecs-t6-large-2-linux-20190824103606 ~]# 
死循环
[root@ecs-t6-large-2-linux-20190824103606 ~]# seq 1 0 10
[root@ecs-t6-large-2-linux-20190824103606 ~]# 
[root@ecs-t6-large-2-linux-20190824103606 ~]# seq -s XXX 1 10
1XXX2XXX3XXX4XXX5XXX6XXX7XXX8XXX9XXX10
[root@ecs-t6-large-2-linux-20190824103606 ~]# seq -w 90 100
090
091
092
093
094
095
096
097
098
099
100


tr 转换/删除/压缩#

  • 字符转换工具
    不能直接对文件进行操作
    命令: tr set1 set2

作用: 用set2中的字符替换掉set1中相同的字符


echo 123456 | tr 345 abc
将左边标准输出的3 转换为 a , 4->b ,  5->c   只要相同, 一一转换
将 /etc/hosts的内容转大写
tr ‘[a-z]’ ‘[A-Z]’ < /etc/hosts
将A-Z 转换成a-z


  • 使用tr 删除字符

格式 tr -d set

删除和set相同的字符


[root@ecs-t6-large-2-linux-20190824103606 ~]# echo 123456 | tr -d 123
456


  • 压缩

将连续相同的字符压缩成一个字符


echo 112233444555666 | tr -s 345  
碰到连续的3, 就压缩成1个3  
碰到连续的4, 就压缩成1个4
tr  -s SET1 SET2
先替换为SET2再压缩
echo 112233444555666 | tr -s 345 abc
echo 112233444555666 | tr 345 abc | tr -s abc


排序sort#


默认会按照每一行的第一个字符进行排序

  • -n: numeric sort 按整数排序
  • -r: reverse 递减排序
  • -k: key 指定某一列为排序键
  • -t: field-separator 指定字段分隔符


例:


[root@ecs-t6-large-2-linux-20190824103606 tmp]# cat sort_text 
dsd
asd
sad
asa
das
da1
da3
d23
123
316
164
a45
d34
456
234
444
d64
as6
da4
d6a
asd
[root@ecs-t6-large-2-linux-20190824103606 tmp]# cat sort_text | sort -n
a45
as6
asa
asd
asd
d23
d34
d64
d6a
da1
da3
da4
das
dsd
sad
123
164
234
316
444
456
[root@ecs-t6-large-2-linux-20190824103606 tmp]# cat sort_text | sort -n -k2
123
164
234
316
444
456
a45
as6
asa
asd
asd
d23
d34
d64
d6a
da1
da3
da4
das
dsd
sad


例2: 按照表格的方式展示 /etc/passwd 的内容


sort  /etc/passwd  | column -t -s ":"
[root@ecs-t6-large-2-linux-20190824103606 tmp]# sort  /etc/passwd  | column -t -s ":"
adm                x  3    4    adm                                                              /var/adm            /sbin/nologin
bin                x  1    1    bin                                                              /bin                /sbin/nologin
daemon             x  2    2    daemon                                                           /sbin               /sbin/nologin
dbus               x  81   81   System message bus                                               /                   /sbin/nologin
....


uniq命令#


删除重复的记录,通常和sort连用


它只会去除连续出现的相同的记录,针对如下记录的结果操作如下
123
123123
123123
123
123
[root@ecs-t6-large-2-linux-20190824103606 tmp]# cat text | uniq
123
123123
123
先排序,再去重的效果如下
[root@ecs-t6-large-2-linux-20190824103606 tmp]# sort -r text | uniq
123123
123


  • -c: count 显示文件中连续出现的次数


[root@ecs-t6-large-2-linux-20190824103606 tmp]# cat text | uniq -c
      1 123
    122 123123
      1 123


  • -u:unique 只显示不重复的行
    cat tt | uniq –u
  • -d:repead 只显示重复的行
    cat tt | uniq -d


wc 命令#


wc(字数统计)命令

格式:wc [选项]... 目标文件...

  • -l:lines 统计行数
  • -w:words 统计字数 (前后都是空白的一组字符)
  • -c:bytes 统计字符数(可见和不可见的字符)


例1:


[root@ecs-t6-large-2-linux-20190824103606 ~]# wc /etc/passwd
  23   44 1092 /etc/passwd
23行  44字 1092字节


例2:


[root@ecs-t6-large-2-linux-20190824103606 ~]# echo 123 | wc -l
1


cut命令#


从指定的文本或者文本流中提取指定的列

格式: cut [可选项] 范围 文本/文本流

可选项

  • -c: 从指定位置提取
  • -f: fields 仅仅打印指定的列
  • -d: delimiter 指定分隔符, 默认是 tab

提取范围

  • n: 第n列
  • n-: 从n到列尾
  • -m: 从开头到m
  • n,m:第n和第m项
  • n-m: 从n到m项


例1:


[root@ecs-t6-large-2-linux-20190824103606 tmp]# ll
total 40
drwxr-xr-x 2 root root  4096 Sep  4 19:35 hsperfdata_root
drwxr-xr-x 2 root root  4096 Sep  4 19:35 jetty-0.0.0.0-9998-browser-_browser-any-6157528924019481141.dir
-rw-r--r-- 1 root root    84 Sep  9 21:46 sort_text
drwx------ 3 root root  4096 Sep  4 15:28 systemd-private-c3ac023caef0453f85963d47758cc2cf-ntpd.service-LXVmNS
-rw-r--r-- 1 root root   862 Sep  9 21:54 text
drwx------ 2 root root  4096 Sep  4 20:22 tmp.2RTupK8p7R
prw-r--r-- 1 root root     0 Sep 10 08:53 wrapper-4156-1-in
prw-r--r-- 1 root root     0 Sep 10 08:53 wrapper-4156-1-out
-rw------- 1 root root 13478 Sep  4 20:16 yum_save_tx.2019-09-04.20-16.5iMOEY.yumtx
提取第十列
[root@ecs-t6-large-2-linux-20190824103606 tmp]# ll | cut -c 10
x
x
-
-
-
-
-
-
-
提取20-40 列
[root@ecs-t6-large-2-linux-20190824103606 tmp]# who | cut -c 20-40
   2019-09-10 08:46 (


数据的提取和过滤#


grep 数据提取程序#


用途: 在文件中查找查找并显示包含指定字符串的行

格式: grep [选项] 模式 目标文件

  • -i: ignore case 查找时忽略大小写
  • -v: invert match 反转查找,输出和模式不相符的行
  • -w: word regexp 按整字查找, 数字,字母,下划线 连在一起就是整字
  • -n: line number 显示符合模式要求的行号
  • -r: 递归查找所有文件
  • -o: 仅仅输出匹配到的字符


模式


a   :包含a的行
^...: 以...开头
...$: 以...结尾


例: 统计文件中某个字的数量


grep -o "abc" abc.txt | wc -l


文件的差异对比#


比较两个文件之间的差异

输出结果为两个文件的不同之处

diff [文件1] [文件2]

没有任何输出说明文件不一样

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
|
17天前
|
C++
C++语言学习文件操作应用案例
C++文件操作示例:创建`ofstream`对象写入&quot;Hello, World!&quot;到`output.txt`,刷新缓冲区,然后使用`ifstream`读取并打印文件内容。如果文件打开失败,程序将显示错误信息并返回1。
11 3
|
1月前
|
存储 监控 API
【C/C++ 文件操作】深入浸润:C++多线程文件操作的艺术与策略
【C/C++ 文件操作】深入浸润:C++多线程文件操作的艺术与策略
58 0
|
1月前
|
存储 运维 搜索推荐
深入理解文件系统与文件操作:从基础概念到高级用法
深入理解文件系统与文件操作:从基础概念到高级用法
|
3月前
熟练使用文件操作类命令(2)
熟练使用文件操作类命令(2)。
21 1
|
3月前
|
Linux
熟练使用文件操作类命令(3)
熟练使用文件操作类命令(3)。
42 2
|
3月前
熟练使用文件操作类命令
熟练使用文件操作类命令。
34 2
|
10月前
|
存储 C语言
文件操作【下篇】
文件操作【下篇】
55 0
|
API C语言 C++
C++文件操作的5种方式
C++文件操作的5种方式
117 1
|
Linux 开发工具 开发者
文件操作管理|学习笔记
快速学习文件操作管理
78 0
|
Python
【通用文件操作】文件自动整理
今天我们就带大家来实现一下文件自动整理的操作。在我们日常生活中,文件总是杂乱无章的,这个时候就需要我们整理一下。但是文件太多的话整理起来是非常麻烦的,因此我们今天就来用Python实现文件的自动整理。
122 0