Linux常用命令——文本编辑

发布于 2021-03-17  35 次阅读


文本编辑

echo

输出内容到标准输出,并在后面增加换行

参数说明:

  • -n 末尾不加换行
  • -e 开启输出字串中对反斜杠的转译
    • 注意:只有开启-e参数的时候,下面的命令才起作用
    • \\ 输出反斜杠
    • \a 报鸣
    • \b 退格
    • \c 抑制当前行换行(但是结果是\c后面的字符都没有显示)
    • \f 填表格(就是新起一行打印,但是纵向的位置不变)
    • \n 换行
    • \r 回车(但是结果是\r前面的字符都没有显示)
    • \t 水平制表符
    • \v 垂直制表符(效果好像和\f一样)
echo -e "OK! \n" # -e 开启转义
echo "It is a test"

输出结果:

OK!

It is a test

cat

显示文件内容

tac(反向cat)反向显示文件内容(参数不同)

# 显示整个文件
cat filename
# 从键盘创建一个文件(不能编辑已有文件)
# > 详见shell重定向
cat > filename << 终止符
# 将几个文件合并为一个文件
cat file1 file2 > file

参数说明:

  • -b 对非空输出行号
  • -n 输出所有行号

显示文件内容,默认输出10行

参数说明:

  • -n<行数> 显示的行数(可以为负)
  • -c<数目> 显示的字节数

tail

显示文件末尾内容

参数说明:

  • -f 循环读取
  • -n<行数> 显示的行数(只有+n和n)

注意:

  • tail -n -5 a.txttail -n 5 a.txt 显示的结果相同
  • tail -n +5 a.txt 显示的内容为从第 5 行开始,直到末尾的内容
  • tail -n 后面的数字有效输入只有单个数字(5)或者加号连接数字(+5)两种

wc

统计指定的文件中字节数、字数、行数

命令格式:

wc [option] file

命令参数:

  • -c 统计字节数
  • -l 统计行数
  • -m 统计字符数
  • -w 统计词数,一个字被定义为由空白、跳格或换行字符分隔的字符串

grep

查找文件里符合条件的字符串,并显示

命令格式:

grep [参数] 查找的字符串 文件名

参数说明:

  • -c 计算找到的次数
  • -i 忽略大小写
  • -v 反向选择(不符合条件)
  • -n 输出行号
  • -e 正则表达式
# 递归查找符合条件的文件
# 例:查找指定目录/etc/abc及其子目录下所有文件中包含字符串"test"的文件,并打印出该字符串所在行的内容
grep -r test /etc/abc 

xargs

xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。

由于很多命令不支持|管道来传递参数,所以就有了 xargs 命令

xargs一般用法:

  • 将管道或标准输入(stdin)数据转换成命令行参数
  • 从文件的输出中读取数据
  • 将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行
  • 捕获一个命令的输出,然后传递给另外一个命令
  • xargs 默认的命令是 echo,换行和空白将被空格取代

命令格式:

somecommand |xargs -item command

参数说明:

  • -a file 从文件中读入作为 stdin
  • -e flag 注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止
  • -p 当每次执行一个argument的时候询问一次用户
  • -n num 命令在执行的时候一次用的argument的个数,默认是用所有的
  • -i 将xargs的每项名称,一行一行赋值给 {}
  • -r 当xargs的输入为空的时候则停止xargs
  • -l num 从标准输入一次读取 num 行送给 command 命令
  • -d delim 指定分隔符,默认的xargs分隔符是回车
  • -0\0即NULL来作为分隔符 通常配合 find print0

例:

# xargs让不支持管道的命令可以使用
find /sbin -perm +700 |ls -l       #这个命令是错误的
find /sbin -perm +700 |xargs ls -l   #这样才是正确的

重新格式化数据

定义一个测试文件,内有多行文本数据:

# cat test.txt

a b c d e f g
h i j k l m n
o p q
r s t
u v w x y z

多行输入 单行输出:

# cat test.txt | xargs
a b c d e f g h i j k l m n o p q r s t u v w x y z

-n 选项 多行输出:

# cat test.txt | xargs -n3

a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w x
y z

指定分隔符

-d 选项可以自定义一个定界符:

# echo "nameXnameXnameXname" | xargs -dX

name name name name

结合 -n 选项使用:

# echo "nameXnameXnameXname" | xargs -dX -n2

name name
name name

捕获输出 当参数传递

假设一个命令为 sk.sh

一个保存参数的文件为 arg.txt:

#!/bin/bash
#sk.sh命令内容,打印出所有参数。

echo $*

arg.txt文件内容:

# cat arg.txt

aaa
bbb
ccc

使用 -i 指定一个替换字符串 {},这个字符串在 xargs 扩展时会被替换掉

每一个参数 命令都会被执行一次:

# cat arg.txt | xargs -I {} ./sk.sh -p {} -l

-p aaa -l
-p bbb -l
-p ccc -l

复制所有图片文件到 /data/images 目录下:

ls *.jpg | xargs -n1 -I {} cp {} /data/images

结合 find

用 rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long.用 xargs 去避免这个问题:

find . -type f -name "*.log" -print0 | xargs -0 rm -f

统计一个源代码目录中所有 php 文件的行数:

find . -type f -name "*.php" -print0 | xargs -0 wc -l

查找所有的 jpg 文件,并且压缩它们:

find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz

其他应用

假如你有一个文件包含了很多你希望下载的 URL,你能够使用 xargs下载所有链接:

cat url-list.txt | xargs wget -c

sed

依照脚本指令处理、编辑文本文件

语法格式:

sed [-hnV][-e<script>][-f<script文件>][文本文件]

参数说明

  • -e<script> 在命令行以指定的script来处理输入的文本文件(默认)
  • -f<script文件> 以指定的script文件来处理输入的文本文件
  • -r 支持扩展表达式
  • -i 直接修改文件内容
  • -n 仅显示script处理后的结果
  • -h 显示帮助
  • -V 显示版本信息

动作说明

  • a\ 新增 接字符串,在下一行出现
  • c\ 取代 接字符串,取代 n1,n2 之间的行
  • d 删除
  • i\ 插入 接字符串,在上一行出现
  • p 打印
  • w 保存 接文件名,保存成文件
  • = 显示行号

注意:

  • 没有 -e 时sed后需要用单引号包裹
  • 同时使用2个-e执行2个命令
  • 同时执行两个动作需要用{}包裹,如:{=;p}
  • !表示与之前匹配的相反,通常在动作前

script语法:

  • 动作:[范围] [动作] [内容]
  • 搜索:/被搜索字符串/[动作]
  • s/要被取代的字串/新的字串/g(类似vim)

^$ 表示空白行

^x 表示行首是x

x$ 表示行尾是x

范围说明:

格式 含义
x,y 第x行到第y行
/x/ 匹配到x的行
/x/,/y/ 同时包含x,y的行
/x/,y 从第一次匹配到x的行到第y行
x,/y/ 第x行到第一次匹配到x的行
x,y! 查询不包含指定行号x和y的行