Linux 文件和文本内容

本篇主要分两类,一类是vim 这种交互式的文本编辑软件,另外就是各种花式的文本处理命令,有 awk、sed 这种强大的命令,也有简单的重定向和echo打印,指在提升文本处理效率,建议试试,来增强记忆


一、编辑软件

Linux 的编辑软件,当然得从vi和vim开始,由于 vim 功能强大,可能也无法覆盖到所有的操作方式,后续发现有趣的技巧,再继续补充上来,本章节的内容介绍vim的用法

vim 强大的编辑器

vi 与 vim 区别

vi 是由 Bill Joy 在 1976 年开发的,Bill Joy 是加州大学伯克利分校的一名学生,他开发 vi 是为了满足自己的需要。vi 是第一个支持多窗口编辑的文本编辑器,它也是第一个支持语法高亮的文本编辑器。

vim 是由 Bram Moolenaar 在 1991 年开发的,Bram Moolenaar 是荷兰的一名程序员,他开发 vim 是为了满足自己对 vi 的需求。vim 是一个高度可定制的文本编辑器,它提供了许多强大的功能,如语法高亮、自动完成、多窗口编辑等。

vim 比 vi 更加强大和灵活。它具有更多的功能和选项,并且支持插件和扩展。然而,这也意味着 vim 的学习曲线比 vi 更陡峭。

简单来说,可以把 vi 类比自带的记事本,而 vim 那就是高级编辑器,功能更丰富和强大

模式

注意如下的按钮和命令都需要是英文半角键盘,全角无法使用

全角模式间距比较大,容易区分,切换方式一般是 shift+空格 ;

如果不管用,试试右键菜单栏的‘中’字样,点击全半角(搜狗输入法有效)

asdf
按下: shfit + 空格
asdf
命令模式

是编辑器的初始模式

进入方式:
    1) vi filename
    2) 输入模式时按 esc
    3) 底线模式命令输入完毕后

输入模式

可以编辑文本内容

进入方式:

        1)命令模式点击 如下按键

                a 在下一个字符插入光标

                i 在光标位置插入光标

                o 在下一行插入光标

底线命令模式

可在底部执行命令的模式

进入方式:

        1) 在命令模式输入 ':'  

常用命令:

  • q 退出
  • wq 保存退出
  • !q 强制退出,不保存
  • w 保存
  • set nu   显示行号 全写是number 可以缩写
  • set nonu  关闭行号显示
  • 输入/ 或 ? 查询

一些技巧

vim 很强大,可以复杂到大佬写书来讲解,然而我这就简单记录一些常用的操作

命令模式

1、 u 撤回修改

按一次撤回一次,直到Already at oldest change

2、取消回撤

Ctrl + r ,取消回撤,这个和按键 u 相反 

3、定位 光标‘跃迁’的技巧

操作按钮用途
数字 + 箭头(← ↑ ↓ →)跳转到指定的行或者列
0本行开头
$本行结尾
gg本文首行
G本文末行
/向下检索,再输入n 搜索下一个,N 搜索上一个
向上检索,再输入n 搜索下一个,N 搜索上一个

   4、编辑文本

下表的字母 ‘n’ 表示数字,剪切和粘贴只针对vim的剪切板

操作用途
x删除当前字符X删除前一个字符
dd剪切当前行p粘贴剪切内容
nd+回车或 箭头(← ↑ ↓ →)剪切n行,或n列p粘贴剪切内容
yy复制当前行p粘贴复制内容
nyy复制n行内容p粘贴复制内容
yG复制当前行到最后一行的内容p粘贴复制内容
ygg复制当前行到第一行的内容p粘贴复制内容
v+箭头(← ↑ ↓ →)选中字符,可以叠加其他按钮V+箭头选中一行或多行,也能叠加其他按钮
Ctrl + v区域选中,竖排选中,等价于编辑器的Shift + alt

5、重复上次操作

'.' ,就是小数点 ,重复上一次的操作

输入模式

Ctrl+u 可以删除本行光标之前的字符,这个和平时敲Linux命令一样

底线命令模式

记得按ESC 

命令用途
:set nu显示行号
:set nonu隐藏行号
:r /path/to/file将文件内容填充到当前光标后面
:n1,n2s/word1/word2/g在n1-n2 之间的行,将word1 替换成word2
:1,$s/word1/word2/g在第一行到最后一行,将word1 替换成word2
:1,$s/word1/word2/gc在第一行到最后一行,将word1 替换成word2,替换前需要确认

重定向

重定向通常和管道同时出现,是一种工作中非常常见的编辑和处理文本的方式,这章节主要记录一些常用的重定向的方式

代号

执行命令都会有标准输入 (stdin)和标准输出(stdout),标准错误输出(stderr)这些内容打印,一般是打印到控制台,我们可以通过重定向将内容指向到我们需要的文件

标准输入: 0

标准输出: 1

标准错误输出: 2

2>&1:将 2> 转到 1>,即将标准错误输出,当成标准输出打印

1>&2:将 1> 转到 2>,即将标准输出,当成标准错误输出打印

如何理解标准输入、标准输出、标准错误输出呢?

标准输入 (stdin):用户输入的来源,通常是键盘。在命令行中输入命令并按回车键时,你的输入就会通过标准输入发送给程序。

标准输出 (stdout):是程序输出信息的目标,通常是显示器。当程序打印信息时,信息就会通过标准输出发送到显示器上。

标准错误输出 (stderr):是程序输出错误信息的目标,通常也是显示器。当程序遇到错误时,错误信息就会通过标准错误输出发送到显示器上。

那什么是输入设备和输出设备呢?看看计算机组成原理吧,不能再加了!

重定向输出

> 覆盖输出

没文件就给你创建个文件也要写进去,当然要是没目录就没辙了,注意会覆盖原有内容

命令用途
> filename 清空文件内容,或者创建文件
echo $PATH > filename将环境变量覆盖写入文件
命令 2> filename将错误输出重定向到filename文件中
>> 追加输出

这个和上面那个不同点在于不覆盖,会追加

命令用途
echo $PATH >> filename将环境变量追加写入文件,或者创建文件并写入内容
命令 2>> 文件将标准错误输出,追加的方式重定向到一个文件中
命令 &>> 文件将标准输出与错误输出共同写入到文件中
命令 >> 文件 2>&1将标准输出与错误输出共同写入到文件中

重定向输入

< 输入

这个玩意,貌似单独用的少,平时也没咋用

命令 < 文件         将文件作为命令的标准输入,比如 wc < /etc/hosts

<< 交互输入

这个看着有点迷糊是吧,迷糊就正常了, 后面有案例,记住案例就行了,用处还是有的

命令用途
命令 << 分界符从标准输入中读入,直到遇见分界符才停止
命令 < 文件1 > 文件2将文件1作为命令的标准输入并将标准输出到文件2

常用重定向

1、交互式往文本中覆盖写入内容

EOF 是上面说的分界符,可以自由定义,只是这个比较常用,也有喜欢用 . 的,看个人喜好

# cat << EOF > foo.txt
hello
world
EOF
# cat foo.txt
hello
world

也可以把内容全部复制,直接执行,就免去在服务器编辑的过程了,另外一种写法,结果都是将分界符之间的内容覆盖写入到指定文件中,如下是编辑team0 网卡,为了避免影响到网络,没加文件全路径,这一段也可以写入到脚本里面,实现多行内容的直接写入;也可以将覆盖改成追加;

cat > ifcfg-team0 << EOF
DEVICE=team0
DEVICETYPE=Team
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
TEAM_CONFIG='{"runner":{"name":"activebackup"},"link_watch":{"name":"ethtool"}}'
EOF

2、清空文件内容

有时候日志文件在写入删除不了,内容无需备份且需要释放空间,试试清空文件吧

> filename

3、将执行结果丢弃,记得用>>

丢弃所有结果 ping 4个包,全丢弃
    ping localhost -c 4 &>> /dev/null

丢弃错误结果 ping 4个包,丢弃报错的内容
    ping localhost -c 4 2>> /dev/null

   4、配置文件去除注释

将ftp 的备份配置文件中没注释的内容,覆盖写入到配置文件中

grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf

5、重定向权限受限

普通用户通过sudo 提权编辑/etc/profile

sudo sh -c "echo 'TMOUT=1800' >> /etc/profile"

注意:不要给vi 这种交互式的编辑软件提供重定向,比如如下操作会卡住

vi filename << EOF

 管道

| 将前面的结果赋值后后面的命令,重定向和管道在文本处理中非常常见

  • 管道命令仅会处理 standard output,对于 standard error output 会予以忽略
  • 管道命令必须要能够接受来自前一个指令的数据成为 standard input 继续处理才行
# 看看用户名多少个字符
echo `hostname` | wc -c

二、文本查看

cat 全文查看

concatenate files and print on the standard output : 连接文件并在标准输出上打印

cat filename    查看文件
cat -n filename 查看文件并显示行号 
cat > filename 创建文件
cat < filename  查看文件内容
cat -A filename 查看文件,并打印换行符

more 分页查看

more - file perusal filter for crt viewing 

用于显示器查看的文件浏览过滤器

more  is  a filter for paging through text one screenful at a time.  This version is especially primitive. 

more是一个过滤器,用于一次一屏地对文本进行分页。这个版本特别原始。

more filename   查看文件
查看过程中,已有下表的操作,more 只能往后看,不能用箭头向上翻页(可以用PgUp翻页)

操作用途
输入?查看帮助
输入/+文本+回车搜索文本,再输入n 就是找匹配的下一个
输入q退出
输入回车下一行
输入空格下一页

 less 分页查看

opposite of more  与more相反

less 也是从头开始阅读文件,但是可以往上翻页,而且匹配的文本会高亮显示,加强版的more,输入h 可以看帮助,功能更强大,退出也是q;

还有个区别,more查看完毕会退出,less 看完不会退出;

head 看开头的内容

output the first part of files 输出文件的前面一部分

一般文件比较大的时候,想仅读取前面一部分内容,不要全部加载时可以用head 

head filename           默认显示前10行
head -n 20 filename     显示前20行,也可以 -n20
head -c 10 filename     显示前10个字符,也可以 -c10
head -v filename        显示前10行,同时首行打印文件名 -q 是不打印,默认不打印

tail 看末尾的内容

output the last part of files   输出文件的最后一部分

和head相反,tail输出最后的内容,但是支持动态输出,文件的修改会一同打印出来

tail filename            查看末尾10行
tail -n50 filename       查看末尾50行,-n 50等价于 -n50
tail -c50 filename       查看末尾50个字符,-c50 等价于 -c 50
tail -n50 -f filename    查看末尾50行,并动态打印文件追加内容
tail -v filename         查看末尾10行,并在首行打印文件名

还有个tailf 等价于tail -f ,不过软件来自不同的包

yum provides tailf
util-linux-2.23.2-61.el7.x86_64

yum provides tail
coreutils-8.22-24.el7.x86_64

三、文件信息

lsof 查看文件列表

list open files  列出已打开的文件列表(包含已经删除但是还被占用的文件)

按理说这个不应该算是文本查看的范畴的,但是呢,这个又经常与文件操作有关,就放这了,还有个pwdx 就简单过一下,pwdx pid 通过进程号,返回进程的工作目录;pwd 是打印当前工作目录;

lsof                不带参数,默认打印所有的已经打开的文件,内容很多,ctrl + c 退出
lsof -p pid         查看进程的相关文件
lsof filename       通过文件找占用进程
lsof -p pid -Pn     查看进程的socket
lsof |grep delete   查看被删除仍占用的文件
lsof /var/log/messages   # 查看在读写 messages 文件的进程 
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
rsyslogd 1487 root    5w   REG  253,3     2001 16778217 /var/log/messages

lsof -p 1487 # 查看进程 1487 在读写哪些文件

file 查看文件类型

可以查看文件类型和文件编码

file filename
file -i filename

 常见的几种编码:

  • ISO-8859 text, with CRLF line terminators   Windows格式,iso-8859-1 编码的文件
  • ASCII text executable   可执行的ASCII 编码的文件
  • UTF-8 Unicode text       UTF-8编码
  • 更多编码 iconv -l 查看 或 man charsets

stat 查看文件属性

display file or file system status 显示文件或文件系统的状态

一般用来看文件的属性,用得少,不过信息全

stat filename        # 查看文件信息
stat -f filename     # 查看文件所在文件系统信息
stat -t filename     # 查看文件信息,一行打印

ls 查看目录内容

list directory contents    列出目录内容

List information about the FILEs (the current directory by default).

目录的内容实际就是目录里面的文件和目录

参数可以叠加
ls                列出当前目录的文件和目录
ls dir            列出指定目录的文件和目录
ls file           列出文件
ls -l             列出当前目录的文件和目录的详细信息
ls -lh            ...  文件大小自动调整成可读单位
ls -t             ...  按修改时间排序,最新的在前面
ls -tr            ...  翻转,最新的在最后
ls -R             ...  递归显示
ls -d             列出当前目录的信息,不显示内容
ls -Z             列出当前目录的SELinux 信息
alise ll='ls -l'
ll -h
ll -tr
ll -trR

du 估算文件使用容量

estimate file space usage  估计文件空间使用情况

Summarize disk usage of each FILE, recursively for directories. 为目录递归地累加每个文件的磁盘使用情况

du的使用

du 命令很常用,平时用来排查目录的磁盘空间占用情况,目录没达到100G以上时,还算快的

如果太大就不太方便了,计算很慢,还可能影响系统性能,上TB的分区,排查占用还是用其他方式,除非愿意等。比如pidstat -d 来看看文件块写入情况,来排查哪些进程异常写入。

所以,使用du 建议尽量缩小范围,来提升效率

du 
    -B, --block-size=SIZE        结果显示单位,默认KB
    -m  like --block-size=1M     结果显示1M

    -d, --max-depth=N            最大统计深度
    -h, --human-readable         结果单位自动调整
    --inodes                     计算inode 数量
    -s, --summarize              汇总统计
du -sh *             统计当前目录下文件和目录大小
du -sh /var          统计/var 目录大小
du -sh /var|grep G   ... 过滤单位达到GB的文件和目录

关于du 和 df 看到的文件容量不一样

1)计算方式不一样

du 命令是通过递归地遍历文件来计算目录的大小(计算)

df 命令是通过查询文件系统的超级块来计算目录的大小(直接查数据)

du 遇见权限报错,就不会将文件容量加上去(没权限就不准)

df 被删除且被进程占用的文件仍在系统中(没删除干净还在)

2)挂载点不同

如果一个文件系统被挂载到多个不同的挂载点上,那么 du 命令和 df 命令可能会计算出不同的容量

df 会按照文件系统的超级块获取信息

du 会如实计算,测试过了,硬链接不会累加,但是重复挂载的文件系统会累加

mkdir /tmp/test
mkdir /tmp/test1
mount /dev/sdb1 /tmp/test

df -Th
/dev/sdb1 xfs       797M   33M  765M   5% /tmp/test

dd if=/dev/zero of=/tmp/test/big_file bs=100M count=2

df -Th
/dev/sdb1 xfs       797M  233M  565M  30% /tmp/test

du -sh /tmp
201M    /tmp

mount /dev/sdb1 /tmp/test1

du -sh /tmp
401M    /tmp

3)其他可能会导致df 命令异常的情况


四、文件的创建与删除

文件创建

文件的创建有很多种方式,就是得注意路径和权限,文件不存在会创建,目录不存在一般不会创建的;另外,关于权限问题,目录的wx权限决定了是否可以在这个目录创建文件,如果当前目录的权限没问题,但是无法创建,试着逐级看看上层目录权限吧。

关于文件权限,可以看看 Linux 文件权限、文件压缩与文件查找-CSDN博客

文件
    vi file     # 创建或编辑文件,好处和缺点是需要进入编辑器
    touch file  # 创建文件,或者更新文件的访问时间 atime
    > file
    echo "hello" > file

目录
    mkdir dir                # 创建目录
    mkdir -p dir_1/dir_2     # 递归创建目录(逐级检查,没有就创建目录)

注意事项:

1、单一文件或目录的最大容许文件名为 255bytes ,英文一个字母一个字节,中文一个字两字节,文件系统的限制

2、避免特殊字符作为文件开头,特别是- + 这种会与命令参数冲突

3、尽量避免用中文创建文件或目录,敲命令的时候有点麻烦

文件重命名

文件或目录的重命名用mv 

mv file1 file2
mv dir dir_new

文件复制

文件的复制,主要得考虑是否会覆盖和问题权限,可能会覆盖的操作,建议都先备份

常用的文件复制分为两种,本地复制和远程复制,也就是cp 和 scp

本地复制 cp

copy files and directories 复制文件和目录

cp 有很多可用的参数,如果有些不常用的需求,建议试着看看帮助文档,或许会有收获,比如对文件权限属性的保留等。

cp file1 file2       # 复制文件
cp -rp source_dir target_dir

一些常见参数:
    -i, --interactive    覆盖文件前提醒,前面有-n, -n参数会失效
    -n, --no-clobber     不要覆盖文件,前面有-i,-i参数会失效

    -l, --link           使用硬链接代替复制文件
    
    --preserve           可以指定复制文件的哪些属性到新文件,
                         default: mode,ownership,timestamps
                         可选:context, links, xattr, all
    -p  等价于 --preserve=mode,ownership,timestamps  复制文件保留这些信息
    
    -R, -r, --recursive  递归复制目录和里面的文件
    -u, --update         当源文件比目标文件新,或者目标文件不存在时复制
man cp     # 基本够用
info cp    # 更详细
cp --help  # 命令帮助

远程复制 scp

secure copy (remote file copy program) 安全的复制,远程文件复制程序

scp copies files between hosts on a network.  It uses ssh(1) for data transfer, and uses the same authentication and provides the same security as ssh(1).  scp will ask for passwords or passphrases if they are needed for authentication.

简单来说,就是通过ssh 协议来进行数据传输的文件拷贝,与 sftp 一样都很常用,所以使用前提是ssh 能用,再细一些就是用户可以远程登录,并且有权限读写目标目录。

远程文件的写法:remote_user@ip:/path/to/remote_file

scp /local/file  remote_user@ip:/path/to/remote_file  # 本地拷贝到远程

scp remote_user@ip:/path/to/remote_file  /local/file  # 远程拷贝到本地
scp 参数
    -p     保留文件属性
    -r     遍历递归目录
    -l     带宽限速,kbit/s
    -P     指定端口
    -q     Quiet mode , 没得进度条以及不打印ssh 的告警和信息
    -o     可以带ssh_option ,-o "StrictHostKeyChecking=no" 跳过指纹验证

跳过指纹验证,在免密的主机重装后会有用处(指纹变化不影响免密,但是会提示确认)

关于scp 什么时候会覆盖文件

需加上-p选项,文件会覆盖,所以操作前请先备份!

情况一:将test目录下的文件,传输到远程指定的目录下

scp -rp test/* localhost:/tmp/test

远程目录结构 需要先建立目标目录

/tmp/test/file  文件会被覆盖

情况二:将test目录,传输到远程指定的目录

scp -rp test localhost:/tmp/test
scp -rp test localhost:/tmp/test/

两种情况:
    1)如果目标目录不存在/tmp/test,将会在目标机器创建 /tmp/test 目录结果和文件
    2)如果目标目录存在/tmp/test,将会在目标机器创建 /tmp/test/test 的目录结构和文件

/tmp/test/test/file 文件会被覆盖

可以看出,如果目录远程复制,目录结构取决于远程目录是否存在,不存在就是你写的目录结构,目录存在会在目录以下再建一层目录

文件上传/下载

sftp 自带的 ftp

secure file transfer program  安全的文件传输程序

sftp 可以在Windows Linux 之间通过ssh协议传输文件,是工作中非常常用的软件了,很多远程连接软件都对sftp做了支持,方便使用,当然也可以用最基本的命令行

Windows 远程Linux sftp,或者Linux远程Linux sftp
sftp remote_user@ip
sftp> 

由于是基于ssh的,所以命令的一些参数和scp 大差不差,就不赘述了,下表记录交互经常会用到的命令,一般本地命令就是在远程命令前加‘l’

sftp 交互常用命令
远程命令用途本机命令用途
help/?查看帮助bye/exit退出sftp
ls查看sftp 服务器工作目录文件列表lls查看本机工作目录文件列表
pwd查看sftp 服务器工作目录lpwd查看本机工作目录
cd path切换sftp 服务器工作目录lcd path切换本机工作目录
put path上传本地文件get path拉取sftp 文件
!command执行本机命令
!打开本机shell

解释一下为什么有些软件可以开启一个sftp窗口,其实这个sftp窗口是Windows访问Linux的sftp 连接窗口,并不是Linux sftp主动连接到Windows的。而克隆会话的功能是通过将现有会话的密钥信息复制到新会话来实现的。

lrzsz 上传下载

lrzsz 软件也提供了便利的文件上传和下载,rz sz 都是通过ZMODEM协议来进行文件传输的,也可能有不支持的情况,不支持就是输入后没反应。

rz 上传文件,执行后会弹出窗口用来选择文件

sz filename 下载文件,执行后,文件会下载到连接软件指定的ZMODEM下载目录

注意:sz 下载大文件可能会失败的,大文件还是sftp相对稳妥一些

文件删除

文件和目录的删除主要是通过 rm 和 rmdir 来实现的,建议给rm 和 rmdir 加上-i 的别名,减少误删

vi ~/.bashrc # 添加如下内容
alias rm='rm -i'
source ~/.bashrc

rmdir 删除空文件

rmdir dir       # 删除空目录
rmdir -p dir    # 递归删除空目录
rmdir -v dir    # 删除时打印被删除的目录

rm 删除文件和目录

这个非常危险,建议删除操作用最小权限用户操作,避免rf /*的时候带空格把系统干崩了

1)删除前强烈建议用ls 命令检查删除的参数,确认清单没问题再敲回车

2)强烈建议最小权限用户操作,以及加-i 参数

3)强烈建议复制的命令,别急着按回车,复制的时候尽量别复制到换行

4)/ 和 * 同时在rm 的参数出现的时候强烈建议检查空格,特别是 / 根前后,有空格就完蛋

5)不太建议用 * 来删除,* 表示全部,当前目录下全部文件

介绍正式开始:

rm 参数
    -i file1 file2    删除文件前,需要确认,可以支持多个参数
    -i file*          删除前缀匹配的文件
    -ri dir           删除目录
    -f file           强制删除

ls file*       如果可以的话,希望你删除前看看文件清单
  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值