本篇主要分两类,一类是vim 这种交互式的文本编辑软件,另外就是各种花式的文本处理命令,有 awk、sed 这种强大的命令,也有简单的重定向和echo打印,指在提升文本处理效率,建议试试,来增强记忆
Linux 的编辑软件,当然得从vi和vim开始,由于 vim 功能强大,可能也无法覆盖到所有的操作方式,后续发现有趣的技巧,再继续补充上来,本章节的内容介绍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) 在命令模式输入 ':'
常用命令:
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
| 将前面的结果赋值后后面的命令,重定向和管道在文本处理中非常常见
# 看看用户名多少个字符 echo `hostname` | wc -c
concatenate files and print on the standard output : 连接文件并在标准输出上打印
cat filename 查看文件 cat -n filename 查看文件并显示行号 cat > filename 创建文件 cat < filename 查看文件内容 cat -A filename 查看文件,并打印换行符
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 | 退出 |
输入回车 | 下一行 |
输入空格 | 下一页 |
opposite of more 与more相反
less 也是从头开始阅读文件,但是可以往上翻页,而且匹配的文本会高亮显示,加强版的more,输入h 可以看帮助,功能更强大,退出也是q;
还有个区别,more查看完毕会退出,less 看完不会退出;
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 是不打印,默认不打印
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
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 filename file -i filename
常见的几种编码:
display file or file system status 显示文件或文件系统的状态
一般用来看文件的属性,用得少,不过信息全
stat filename # 查看文件信息 stat -f filename # 查看文件所在文件系统信息 stat -t filename # 查看文件信息,一行打印
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
estimate file space usage 估计文件空间使用情况
Summarize disk usage of each FILE, recursively for directories. 为目录递归地累加每个文件的磁盘使用情况
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的文件和目录
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
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 # 命令帮助
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 文件会被覆盖
可以看出,如果目录远程复制,目录结构取决于远程目录是否存在,不存在就是你写的目录结构,目录存在会在目录以下再建一层目录
secure file transfer program 安全的文件传输程序
sftp 可以在Windows Linux 之间通过ssh协议传输文件,是工作中非常常用的软件了,很多远程连接软件都对sftp做了支持,方便使用,当然也可以用最基本的命令行
Windows 远程Linux sftp,或者Linux远程Linux sftp sftp remote_user@ip sftp>
由于是基于ssh的,所以命令的一些参数和scp 大差不差,就不赘述了,下表记录交互经常会用到的命令,一般本地命令就是在远程命令前加‘l’
远程命令 | 用途 | 本机命令 | 用途 |
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 软件也提供了便利的文件上传和下载,rz sz 都是通过ZMODEM协议来进行文件传输的,也可能有不支持的情况,不支持就是输入后没反应。
rz 上传文件,执行后会弹出窗口用来选择文件
sz filename 下载文件,执行后,文件会下载到连接软件指定的ZMODEM下载目录
注意:sz 下载大文件可能会失败的,大文件还是sftp相对稳妥一些
文件和目录的删除主要是通过 rm 和 rmdir 来实现的,建议给rm 和 rmdir 加上-i 的别名,减少误删
vi ~/.bashrc # 添加如下内容 alias rm='rm -i' source ~/.bashrc
rmdir dir # 删除空目录 rmdir -p dir # 递归删除空目录 rmdir -v dir # 删除时打印被删除的目录
这个非常危险,建议删除操作用最小权限用户操作,避免rf /*的时候带空格把系统干崩了
1)删除前强烈建议用ls 命令检查删除的参数,确认清单没问题再敲回车
2)强烈建议最小权限用户操作,以及加-i 参数
3)强烈建议复制的命令,别急着按回车,复制的时候尽量别复制到换行
4)/ 和 * 同时在rm 的参数出现的时候,强烈建议检查空格,特别是 / 根前后,有空格就完蛋
5)不太建议用 * 来删除,* 表示全部,当前目录下全部文件
介绍正式开始:
rm 参数 -i file1 file2 删除文件前,需要确认,可以支持多个参数 -i file* 删除前缀匹配的文件 -ri dir 删除目录 -f file 强制删除 ls file* 如果可以的话,希望你删除前看看文件清单