前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【linux学习指南】Linux管理文件与处理数据二(重定向与管道)

【linux学习指南】Linux管理文件与处理数据二(重定向与管道)

作者头像
学习起来吧
发布2024-08-16 08:11:34
2430
发布2024-08-16 08:11:34
举报
文章被收录于专栏:学习C/++

📝前言

本文将介绍Linux系统中的常用命令:mv、cat、echo、重定向、head和tail,主要用于文件管理和数据处理。重点讲解mv命令和重定向的示例,最后演示如何用head和tail快速提取大型文件中的指定行。

🌠 mv指令(重要):

mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命 令,经常用来备份文件或者目录。

语法: mv [选项] 源文件或目录 目标文件或目录 功能:

  1. 视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的 目录中。
  2. 当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它 将所给的源文件或目录重命名为给定的目标文件名。
  3. 当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至 目标目录中。

功能图示总结:

常用选项: -fforce 强制的意思,如果目标文件已经存在,不会询问而直接覆盖 -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!

举例:

代码语言:javascript
复制
将rm改造成mv
vim ~/.bashrc #修改这个文件
mkdir -p ~/.trash
alias rm=trash
alias ur=undelfile
undelfile() {
 mv -i ~/.trash/\$@ ./
}
trash() {
 mv $@ ~/.trash/
}

🌉cat

语法:cat [选项][文件] 功能: 查看目标文件的内容 常用选项:

  • b 对非空输出行编号
  • n 对输出的所有行编号
  • s 不输出多行空行

普通的输入cat,在显示器上输入什么,回车就打印什么。要退出这种普通输入模式,你可以按下 Ctrl+D 组合键。这样会告诉 cat 命令你已经完成了输入,它会退出输入模式。

合并多个文件内容:

代码语言:javascript
复制
cat file1.txt file2.txt file3.txt > combined.txt

这将把 file1.txtfile2.txtfile3.txt 的内容合并到 combined.txt 文件中。

创建新文件:

代码语言:javascript
复制
cat > new_file.txt

-> 输入数据+回车

代码语言:javascript
复制
这将在终端中创建一个新文件 `new_file.txt`,并将输入的内容写入其中。按 `Ctrl+D` 结束输入。
带行号查看文件内容:如果打印显示需要行号,则输入`cat -n new_file.txt`,其他同理。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/466a3373df4f40638ad4d98a405bd3f7.png)
# 🌠less
`tac` 命令与 `cat` 命令类似,但它是以相反的顺序显示文件内容。

基本语法:

```powershell

使用示例:

  1. 查看文件内容,以相反顺序显示: tac file.txt 这将以从下到上的顺序显示 file.txt 文件的内容。
  2. 合并多个文件内容,并以相反顺序显示: tac file1.txt file2.txt file3.txt 这将先显示 file3.txt 的内容,然后是 file2.txt,最后是 file1.txt
  3. 创建新文件:
代码语言:javascript
复制
   tac > new_file.txt
   -> 输入数据+回车

这将创建一个新文件 new_file.txt,并将输入的内容以相反顺序写入其中。按 Ctrl+D 结束输入。

cat 命令相比, tac 命令主要的区别就是它会以相反的顺序显示或写入文件内容。除此之外,它们的用法基本相同。

🌠linux文件

Linux下一切皆文件。 键盘,显示器—文件来看待---- printf/cout—我们向显示器进行打印----向显示器文件进行写入scanf/cin -±键盘读取数据—从键盘文件中读取数据

在Linux中,"一切皆文件"的理念确实很有趣。拓展阅读了解:

  1. 键盘和显示器作为文件
    • 键盘:在Linux中,键盘输入通常通过特殊的设备文件来处理。例如,/dev/tty/dev/ttyS0(串口设备)、/dev/input/event0(输入事件)等设备文件对应着不同的输入设备。程序可以通过读取这些文件来获取来自键盘的输入数据。
    • 显示器:显示器也是通过设备文件进行操作的。例如,/dev/tty/dev/console文件可以用来向终端显示内容。此外,图形显示器的操作通常涉及到更复杂的图形系统(如X Window系统),但底层的图形设备还是通过设备文件来管理的。
  2. 标准输入输出
    • printf/cout:在C/C++程序中,printfcout用于向标准输出(通常是显示器)写入数据。这实际上是向标准输出设备文件(如/dev/tty)写入数据。操作系统会将这些数据渲染到显示器上。
    • scanf/cin:同样,scanfcin用于从标准输入(通常是键盘)读取数据。程序通过读取标准输入设备文件(如/dev/tty)来获取用户的输入数据。
  3. 文件描述符
    • 在Linux中,标准输入(stdin)、标准输出(stdout)和标准错误(stderr)分别对应文件描述符0、1和2。这些文件描述符指向相应的设备文件,操作这些文件描述符就是在进行设备操作。例如,printf操作的是标准输出的文件描述符1,而scanf操作的是标准输入的文件描述符0。

这个设计使得程序可以用一致的方式处理各种输入和输出设备,不需要特别为每种设备编写代码。无论是与文件、网络还是设备交互,程序员都可以通过类似的接口进行操作。这种设计理念极大地提高了系统的灵活性和可扩展性。

🌉echo 与 >

echo 命令是一个非常常见和基本的 Linux/Unix 命令,它用于在终端或控制台上输出文本或变量的值。

基本语法:

代码语言:javascript
复制
echo [选项] [字符串]

常用选项:

  • -n: 不输出结尾的换行符
  • -e: 启用转义字符解释

使用示例:

向显示器文件进行写入

代码语言:javascript
复制
echo "Hello, world!"

输出:

输出变量值:

代码语言:javascript
复制
 NAME="Linux"
 echo "My name is $NAME"

输出:

使用选项:

代码语言:javascript
复制
echo -n "Enter your name: "
read name
echo -e "Hello, $name!\n"

输出:

代码语言:javascript
复制
Enter your name: Linux
Hello, Linux!

将输出重定向到文件:

代码语言:javascript
复制
echo "This is a test." > test.txt

这将把 "This is a test." 写入到 test.txt 文件中。

🌠Linux的重定向技术

Linux的重定向技术允许你将输入输出流重新指向文件或其他设备,而不是使用默认的标准输入(stdin)、标准输出(stdout)或标准错误(stderr)。

  1. 输出重定向

将命令的输出发送到文件而不是显示器上。

基本输出重定向

代码语言:javascript
复制
command > file.txt

这会将 command 的标准输出重定向到 file.txt 文件。如果文件已存在,它会被覆盖。

追加输出重定向

代码语言:javascript
复制
command >> file.txt

这会将 command 的标准输出追加到 file.txt 文件末尾,而不会覆盖原有内容。

  1. 输入重定向

将命令的输入从文件读取,而不是从键盘读取。

基本输入重定向

代码语言:javascript
复制
command < file.txt

输入重定向,本来应该默认从键盘文件来,<∶更改成为从指定文件中读取数据

  1. 错误重定向

将命令的标准错误输出重定向到文件。

标准错误重定向

代码语言:javascript
复制
command 2> error.txt

这会将 command 的标准错误(文件描述符2)重定向到 error.txt 文件。

追加标准错误重定向

代码语言:javascript
复制
command 2>> error.txt

这会将 command 的标准错误追加到 error.txt 文件末尾。

  1. 同时重定向标准输出和标准错误

将标准输出和标准错误重定向到同一文件

代码语言:javascript
复制
command > all_output.txt 2>&1

这会将 command 的标准输出和标准错误都重定向到 all_output.txt 文件。2>&1 的意思是将标准错误(文件描述符2)重定向到标准输出(文件描述符1)。

  1. 管道

管道将一个命令的输出直接传递给另一个命令作为输入。

基本管道用法

代码语言:javascript
复制
command1 | command2

这会将 command1 的标准输出作为 command2 的标准输入进行处理。例如:

代码语言:javascript
复制
ls | grep "txt"

这会列出当前目录中的所有文件,然后用 grep 过滤出包含 “txt” 的文件名。

文章下面使用tailhead时有清晰的认识:

  1. 使用 tee 命令

tee 命令可以将标准输出同时写入文件和终端。

基本用法

代码语言:javascript
复制
command | tee file.txt

这会将 command 的输出同时写入 file.txt 文件和终端显示器上。

追加用法

代码语言:javascript
复制
command | tee -a file.txt

这会将 command 的输出追加到 file.txt 文件末尾,同时也输出到终端。

  1. 文件描述符

在Linux中,除了标准输入(0)、标准输出(1)和标准错误(2)之外,你还可以使用其他文件描述符进行重定向。你可以自定义文件描述符进行高级操作。

示例

代码语言:javascript
复制
exec 3> file.txt
echo "Hello, World!" >&3
exec 3>&-

这会将 “Hello, World!” 写入 file.txt,使用了文件描述符3。

🌠准备指令

我们先往文件写点内容,往下举例子用到:

代码语言:javascript
复制
[root@hcss-ecs-ab43 ~]# cnt=1; while [ $cnt -le 10000 ]; do echo "hello $cnt"; let cnt++; done > log.txt
[root@hcss-ecs-ab43 ~]# ll
total 108
-rw-r--r-- 1 root root 108894 Aug 10 15:28 log.txt

这个命令会输出 10000 行 “hello 1”, “hello 2”, … “hello 10000”,并将这些输出重定向保存到 log.txt 文件中。

分析:

  1. cnt=1 将变量 cnt 初始化为 1。
  2. while [ cnt -le 10000 ]; do ... done 开始一个 while 循环,只要 cnt 小于等于 10000,就执行循环体中的命令。
  3. echo "hello
  4. let cnt++((cnt++)) 递增 cnt 变量的值。这两种写法都可以实现让 cnt 变量自增 1。
  5. > log.txt 将循环过程中输出的所有内容重定向到 log.txt 文件中。

🌉head指令

headtail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾

语法:

代码语言:javascript
复制
 head [参数]... [文件]...  

功能: head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。 选项:

代码语言:javascript
复制
-n<行数> 显示的行数

举个例子:

代码语言:javascript
复制
head -5020 log.txt

🌉tail指令

tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容.

语法: tail[必要参数][选择参数][文件] 功能: 用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。 选项: -f 循环读取 -n<行数> 显示行数

举个例子: 如果我们要把一个log.txt数据中[5000,5020]行拿出来,怎么做呢? 我先把log.txt的前5020行放到new.txt中,然后再取尾部21行。

代码语言:javascript
复制
[root@hcss-ecs-ab43 ~]# head -5020 log.txt >new.txt
[root@hcss-ecs-ab43 ~]# tail -21 new.txt

当然这个方法需要两步,有些繁琐,我们可以使用管道 | 一步搞定:

管道还可以多重利用,然后进行加工:

代码语言:javascript
复制
head -5020 log.txt | tail -21 | cat | tac | wc -l     //末尾这个是l不是管道|,也不是数字1

这里的wc -l:计算行数

管道图解:


🚩总结

mv指令(重要):- 用于移动或重命名文件和目录 mv src[文件、目录]dst[路径、文件] 1.剪切文件、目录 mv src文件–>重命名mv hello.txt world.txt ->hello.txt->wor1d.txt 2.重命名 mv src路径–>剪切mvmv world.txt dir1/test/

cat 命令:功能: 查看目标文件的内容

echo 与 >

  • echo 用于在终端中输出文本。
  • 用于将输出重定向到文件。

Linux的重定向技术

  • 介绍了 Linux 的重定向概念,包括输入重定向 <、输出重定向 >、追加重定向 >> 等。

head指令

  • 用于显示文件的前几行内容。 tail指令
  • 用于显示文件的后几行内容。 小例子:head -5020 log.txt | tail -21 | cat | tac | wc -l
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 📝前言
  • 🌠 mv指令(重要):
    • 🌉cat
    • 🌠linux文件
      • 🌉echo 与 >
      • 🌠Linux的重定向技术
      • 🌠准备指令
        • 🌉head指令
          • 🌉tail指令
          • 🚩总结
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档