【Linux】常用的文本处理命令详解 + 实例 [⭐实操常用,建议收藏!!⭐]

在这里插入图片描述

👨‍🎓博主简介

  🏅云计算领域优质创作者
  🏅华为云开发者社区专家博主
  🏅阿里云开发者社区专家博主
💊交流社区:运维交流社区 欢迎大家的加入!
🐋 希望大家多多支持,我们一起进步!😄
🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗


常用的文本处理命令目录

  • 1、rename 批量修改文件名
    • rename 介绍:
    • rename 格式:
    • rename 实例:
  • 2、dirname 去除文件名中的非目录部分(取路径的目录部分)
    • dirname 介绍:
    • dirname 格式:
    • dirname 实例:
  • 3、basename 显示文件路径名的基本文件名(取路径中的文件名)
    • basename 介绍:
    • basename 格式:
    • basename 实例:
  • 4、cut 按列提取文件内容(切割文本内容)
    • cut 介绍:
    • cut 格式:
    • cut 实例:
  • 5、sort 对文件内容进行排序
    • sort 介绍:
    • sort 格式:
    • sort 实例:
  • 6、uniq 去除文件中的重复内容行(去重 相邻 的重复行)
    • uniq 介绍:
    • uniq 格式:
    • uniq 实例:
  • 7、tee 读取标准输入的数据(双重重定向)
    • tee 介绍:
    • tee 格式:
    • tee 实例:
  • 8、tr 字符转换工具(字符串替换)
    • tr 介绍:
    • tr 格式:
    • tr 实例:
  • 9、join 连接两个文件-->以某列为主,相同合并两个文件(不相同的话先排序)
    • join 介绍:
    • join 格式:
    • join 实例:
  • 10、paste 合并两个文件-->合并文件的列,把每个文件以列队列的方式合并显示
    • paste 介绍:
    • paste 格式:
    • paste 实例:
  • 11、split 分割文件内容
    • split 介绍:
    • split 格式:
    • split 实例:
  • 12、diff / vimdiff [多]文本比较
    • diff / vimdiff 介绍:
    • diff / vimdiff 格式:
    • diff / vimdiff 实例:
  • 13、xagrs 给其他命令传参数的过滤器
    • xagrs 介绍:
    • xagrs 格式:
    • xagrs 实例:
  • 14、rev 将文件中的每行内容反序输出(以列为单位)
    • rev 介绍:
    • rev 格式:
    • rev 实例:
  • 15、shuf 产生随机的排列(指定输出内容,随机输出没有顺序)
    • shuf 介绍:
    • shuf 格式:
    • shuf 实例:
  • 16、Shell脚本的调式
    • 方法一:set 方式
      • 脚本 外 使用调式
      • 脚本 内 使用调式
    • 方法二:bashdb 第三方调试工具
      • bashdb的安装
      • bashdb的使用

1、rename 批量修改文件名

首先:批量创建文件(20个)

touch test-{1..20}.txt

在这里插入图片描述

rename 介绍:

  rename命令的功能是用于批量修改文件名称。与mv命令一次只能修改一个文件名不同,rename命令能够基于正则表达式对文件名进行批量修改,但要求是把匹配规则准确地描述给系统。

  rename命令的参数有三项:其一是当前文件名中要被修改的字符,其二是其要被修改为的新字符,其三是要被执行的对象文件列表。初次可能有点难理解,动手尝试下吧~

rename 格式:

rename 原字符 新字符 文件名

rename 实例:

实例1:修改名为 test-18.txt 为 cs-18.txt

单个修改还是推荐mv命令;

rename test-18.txt cs-18.txt test-18.txt

在这里插入图片描述

实例2:将所有test开头的文件全部修改为abc开头的

rename test abc test*

在这里插入图片描述

实例3:将所有的txt后缀改为cfg

rename txt cfg *

在这里插入图片描述

实例4:将所有的a都改为A

rename a A *

在这里插入图片描述

2、dirname 去除文件名中的非目录部分(取路径的目录部分)

dirname 介绍:

  dirname命令去除文件名中的非目录部分,仅显示与目录有关的内容。dirname命令读取指定路径名保留最后一个/及其后面的字符,删除其他部分,并写结果到标准输出。如果最后一个/后无字符,dirname命令使用倒数第二个/,并忽略其后的所有字符。dirname 和 basename 通常在 shell 内部命令替换使用,以指定一个与指定输入文件名略有差异的输出文件名。

dirname 格式:

dirname [参数]

dirname 实例:

实例1:去除 // 的非目录部分结果为 / :

dirname //#结果为
/

实例2:去除 /a/b/ 的非目录部分结果为 /a :

dirname /a/b/#结果为
/a

实例3:去除 a 的非目录部分结果为 :

dirname a#结果为
.

实例4:去除 a/b 的非目录部分结果为路径名 a :

dirname a/b#结果为
a

在这里插入图片描述

3、basename 显示文件路径名的基本文件名(取路径中的文件名)

basename 介绍:

  basename命令主要用于显示文件路径名剔除目录部分后的显示文件名。如何指定了后缀参数suffix,同时也删除文件的扩展名。其中,name是文件的路径名,suffix是文件名的后缀。

basename 格式:

basename [参数]

basename 实例:

显示文件路径名/usr/bin/lcy的基本文件名lcy:

basename /usr/bin/lcy#结果为
lcy

在这里插入图片描述

4、cut 按列提取文件内容(切割文本内容)

cut 介绍:

  cut命令的功能是用于按列提取文件内容。常用的grep命令仅能对关键词进行按行提取过滤,而cut命令则是可以根据指定的关键词信息,针对特定的列内容进行过滤。

cut 格式:

cut [参数] 文件名
cat 文件名 | cut [参数]

常用参数:

参数解析
-d指定分隔符
-f指定取第几段,与-d一起使用
-b按字节进行切割(一般是英文)
-c按字符进行切割(一般是中文)

cut 实例:

实例1:以冒号为间隔符,仅提取指定文件中第一列的内容:

cat /etc/passwd | cut -d : -f 1
cut -d : -f 1 /etc/passwd

在这里插入图片描述

实例2:仅提取指定文件中每行的前4个字符:

cat /etc/passwd | cut -c 1-4
cut -c 1-4 /etc/passwd

在这里插入图片描述

实例3:以空格为单位切割只要成功、失败两个字

在这里插入图片描述

cat a.txt | cut -d " " -f 1 | cut -c 4-5

在这里插入图片描述

实例4:切割passwd中只有root四个字

head -1 /etc/passwd | cut -d ":" -f 1	

在这里插入图片描述

5、sort 对文件内容进行排序

sort 介绍:

  sort命令的功能是对文件内容进行排序。有时文本中的内容顺序不正确,一行行的手动修改实在太麻烦了。此时使用sort命令就再合适不过了,它能够对文本内容进行再次排序。

sort 格式:

sort [参数] 文件名
cat 文件名 | sort [参数]

常用参数:

参数解析
-n(number)以数字为单位进行排序
-r降序排
-t指定分隔符,默认是空格
-k以某段进行排序
-b忽略每行前面出现的字符
-c检查文件是否已经按照顺序排序
-d除字母、数字及空格字符外,忽略其他字符
-f将小写字母视为大写字母
-h以更易读的格式输出信息(以人类可读的方式)
-i除040至176之间的ASCII字符外,忽略其他字符
-m将几个排序号的文件进行合并
-M将前面3个字母依照月份的缩写进行排序
-o将排序后的结果写入指定文件
-R依据随机哈希值进行排序
-T设置临时目录
-z使用0字节结尾, 而不是换行

sort 实例:

实例1:整体文件内容排序(优先空格–>数字–>字母–>中文)

不加任何参数默认只给首字母排序

sort a.txt
cat a.txt | sort

在这里插入图片描述
在这里插入图片描述

实例2:文本中数字从大到小排序(降序)

sort -nr a.txt
cat a.txt | sort -nr

在这里插入图片描述

实例3:文本中数字从小到大排序(升序)

sort -n a.txt
cat a.txt | sort -n

在这里插入图片描述

实例4:以冒号(:)为间隔符,对指定的文件内容按照数字大小对第3列进行排序(降序)

sort -t : -k 3 -n /etc/passwd

在这里插入图片描述

6、uniq 去除文件中的重复内容行(去重 相邻 的重复行)

uniq 介绍:

  uniq命令来自英文单词unique的缩写,中文译为独特的、唯一的,其功能是用于去除文件中的重复内容行。uniq命令能够去除掉文件中相邻的重复内容行,如果两端相同内容中间夹杂了其他文本行,则需要先使用sort命令进行排序后再去重复,这样保留下来的内容就都是唯一的了。

uniq 格式:

uniq [参数] 文件名
cat 文件名 | uniq [参数]

常用参数

参数解析
-c统计,显示每行在文本中重复出现的次数
-d设置每个重复纪录只出现一次
-u仅显示没有重复的纪录
-D显示所有相邻的重复行
-f跳过对前N个列的比较
-i忽略大小写
-s跳过对前N个字符的比较
-w仅对前N个字符进行比较
-z设置终止符(默认为换行符)

uniq 实例:

文本原文

在这里插入图片描述

实例1:去除相邻的重复行,并显示重复次数

uniq -c a.txt
cat a.txt | uniq -c

前面的3、1代表的是统计的 相邻 重复行次数。

在这里插入图片描述

可以看到有几个也是一样的,但是没有进行统计,那是因为他们不是相邻的行,这时候我们可以结合sort命令排序来进行统计;

cat a.txt | sort -n | uniq -c

在这里插入图片描述

实例2:只统计没有重复的相邻的行的数据

uniq -u a.txt
cat a.txt | uniq -u

在这里插入图片描述

实例3:只统计重复的相邻的行的数据

cat a.txt | uniq -d 
uniq -d a.txt

在这里插入图片描述

实例4:忽略大小写去除相邻相邻的重复行,并显示重复次数

初始数据:

在这里插入图片描述

uniq -ic a.txt
cat a.txt | uniq -ic

在这里插入图片描述

7、tee 读取标准输入的数据(双重重定向)

默认覆盖到文件中

tee 介绍:

tee命令的功能是用于读取标准输入的数据,将其内容转交到标准输出设备中,同时保存成文件,并在页面上显示出来。

tee 格式:

tee [参数] 文件名
cat 文件名 | tee [参数]

常用参数

参数解析
-a追加
-i忽略中断信号
-p诊断写入非管道的错误

tee 实例:

实例1:执行uptime指定的命令,并将其执行结果即输出到屏幕,又写入到文件中

uptime | tee cs.txt

在这里插入图片描述

实例2:将要输入的结果即输出到屏幕上,又追加到cs.txt中

echo "123123" | tee -a cs.txt

在这里插入图片描述

实例3:随机输出1-50之间的随机数,将结果输出到屏幕上,并追加到cs.txt文件中

echo $((RANDOM%50+1)) | tee -a cs.txt

在这里插入图片描述

8、tr 字符转换工具(字符串替换)

tr 介绍:

tr命令来自英文单词“transform”的缩写,中文译为“转换”,其功能是用于字符转换。tr命令是一款批量字符转换、压缩、删除的文本工具,但仅能从标准输入中读取文本内容,需要与管道符或输入重定向操作符搭配使用。

tr 格式:

tr [参数] 原字符串 替换的字符串
ehco "字符串"|tr "原字符串" "替换的字符串"

常用参数

参数解析
-c排除某个字符替换其他字符
-d删除指定的字符串
-s去除相邻重复的字符
-t将字符串1截断为字符串2的长度

tr 实例:

实例1:直接展示输出abc,将abc替换为大写的ABC

echo "abc" | tr "abc" "ABC"

在这里插入图片描述

实例2:将文本中的小写的test全部变为大写的TEST

这个转换并没有起到修改的作用,因此看着是都转换了,但文本中还是小写的。

cat a.txt | tr "test" "TEST"

在这里插入图片描述

实例3:输出一长串字符串,只删除a-z的字母,其他都留着

echo "aaaaaaaaabbbbbbbbbbbbbbbbbb1c2c3cc" | tr -d "a-z"
echo "aaaaaaaaabbbbbbbbbbbbbbbbbb1c2c3cc" | tr -d [a-z]

在这里插入图片描述

实例4:去除相邻的相同字符,只保留一个

echo "aaaaaaaabbbbbbbccccccc" | tr -s "a-z"
echo "aaaaaaaabbbbbbbccccccc" | tr -s [a-z]

在这里插入图片描述

实例5:只保留字符abc,其余字符都替换成逗号

echo "aaaaaaaaabbbbbbbbbbbbbbbbbb1c2c3cc" | tr -c "abc" ","

在这里插入图片描述

实例6:将所有的a-z的小写,全部替换为大写

cat a.txt | tr [a-z] [A-Z]
tr [a-z] [A-Z] < a.txt

在这里插入图片描述

9、join 连接两个文件–>以某列为主,相同合并两个文件(不相同的话先排序)

join 介绍:

join的连接操作简言之就是将两个具有相同域的纪录给挑选出来,再将这些纪录所有的域放到一行。

注意:join在对两个文件进行连接时,两个文件必须都是按照连接域排好序的,按其他域排序是无效的。

join 格式:

join [参数] [文件1] [文件2]

常用参数

参数解析
-a1或-a2除了显示共同域的纪录之外,-a1显示第一个文件没有共同域的纪录,-a2显示第二个文件中没有共同域的纪录
-i忽略大小写
-o设置结果显示的格式
-t改变域的分隔符
-v1或-v2不显示共同域的纪录之外,-v1显示第一个文件没有共同域的纪录,-v2显示第二个文件中没有共同域的纪录
-1或-2-1用来设置文件1连接的域,-2用来设置文件2连接的域

join 实例:

实例1:将两个文件的具有共同域的记录连接在一起

[root@localhost lcy]# cat file.db 
A li:20:men:anhui
B wang:21:women:jiangsu
C zhang:22:men:anhui
D liu:23:women:Shanghai
E chen:23:women:Hefei
[root@localhost lcy]# cat filecs.db 
A li:Song
B wang:shopping
C zhang:pingpong
D liu:chess
E Wang:reading
[root@localhost lcy]# join -t ":" file.db filecs.db 
A li:20:men:anhui:Song
B wang:21:women:jiangsu:shopping
C zhang:22:men:anhui:pingpong
D liu:23:women:Shanghai:chess

在这里插入图片描述

实例2:-a1还显示第一个文件中没有共同域的纪录,-a2则显示第二个

文本内容:

在这里插入图片描述

[root@localhost lcy]# join -t ":" -a1 file.db filecs.db 
A li:20:men:anhui:Song
B wang:21:women:jiangsu:shopping
C zhang:22:men:anhui:pingpong
D liu:23:women:Shanghai:chess
E chen:23:women:Hefei
[root@localhost lcy]# join -t ":" -a2 file.db filecs.db 
A li:20:men:anhui:Song
B wang:21:women:jiangsu:shopping
C zhang:22:men:anhui:pingpong
D liu:23:women:Shanghai:chess
E Wang:reading

实例3:设置指定格式的域来显示出来(将具有共同纪录的域按照姓名+性别+爱好的格式显示出来)

[root@localhost lcy]# join -t ":" -o 1.1 1.3 2.2 file.db filecs.db 
A li:men:Song
B wang:women:shopping
C zhang:men:pingpong
D liu:women:chess

10、paste 合并两个文件–>合并文件的列,把每个文件以列队列的方式合并显示

paste 介绍:

paste命令来自英文单词“粘贴”,其功能是用于合并两个文件。paste命令能够将两个文件以列对列的方式进行合并,相当于是把两个不同的文件内容粘贴到了一起,形成新的文件,如需先将内容合并成一行,再以行粘贴的方式合并,可以用-s参数搞定。

paste 格式:

paste [参数] 文件名1 文件名2

常用参数

参数解析
-d设置自定义间隔符【指定连接符】
-s将每个文件粘贴成一行【将文件多行变成一行输出】
- -从标准输入中读取数据

paste 实例:

实例1:将2行字符串修改为1行,在第一行后面添加=用于连接第二行

文本初始内容:

在这里插入图片描述

#以=和\n轮流做分隔符
paste -sd '=' a.txt
#一个-表示读入一行
paste -d '=' - - < a.txt

在这里插入图片描述

实例2:将2个文件进行合并

[root@localhost lcy]# cat a.txt 
aaa
bbb
ccc
ddd
eee[root@localhost lcy]# cat b.txt 
AAA
BBB
CCC
DDD
EEE[root@localhost lcy]# paste a.txt b.txt 
aaa	AAA
bbb	BBB
ccc	CCC
ddd	DDD
eee	EEE

在这里插入图片描述

实例3:将2个文件进行合并,并添加:为分隔符

paste -d ':' a.txt b.txt

在这里插入图片描述

实例4:将每个文件的内容转为一行,在进行合并

paste -s a.txt b.txt

在这里插入图片描述

11、split 分割文件内容

split 介绍:

  split命令来自英文单词“分裂”,其功能是用于分割文件内容。Linux系统运维人员可以使用split命令对指定的大文件进行内容分割,默认会按照每1000行切割成一个小文件来执行,也可以自定义分割大小,方便阅读和传输。

split 格式:

split [参数] 文件名 [要修改的文件名前缀]

常用参数:

参数解析
-数字设置要分割的行数
-a设置后缀长度
-l以行为单位进行切割
-b以字节为单位进行切割
-C保持每行的完整性
-d以数字做后缀而不是字母
-t设置间隔符
–verbose显示执行过程详细信息

split 实例:

实例1:文件"a.txt"每6行切割成一个文件

split -6 a.txt	

将文件中的文字以每6行切割为一份文件,切割成多个以"x"开头的小文件。

在这里插入图片描述

linux中split命令切割出来的文件名为什么是xaa、xab之类的????

在 Linux 中,split 命令用于将文件分割成指定大小的较小文件。默认情况下,split 命令会以字母序列来命名分割后的文件,第一个文件会被命名为 x,第二个文件会被命名为 aa,第三个文件会被命名为 ab,以此类推。

这是因为在 Linux 中,split 命令默认使用 6 位数来表示文件名,其中前两个字符用于表示文件大小,后四个字符用于表示文件名的唯一性。例如,如果原始文件名为 example.txt,则第一个分割后的文件可能会被命名为 xaa.txt,第二个分割后的文件可能会被命名为 xab.txt,以此类推。

可以通过在 split 命令中使用 -d 选项来指定使用数字序列来命名文件,例如:

实例2:切割文件以字节为单位10字节,以lcy作为前缀,以数字作为后缀

split -d -b 10 a.txt lcy_

在这里插入图片描述

在上面的例子中,-d 选项用于指定使用数字序列来命名文件,-b 10 选项用于指定每个分割后的文件大小为 10字节,a.txt 是要分割的文件名,lcy_ 是用于指定前缀的字符串。这样,第一个分割后的文件会被命名为 lcy_00,第二个分割后的文件会被命名为 lcy_001,以此类推。
当然,其他单位也可以,比如m(兆比)或者k(K比),split -d -b 10k a.txt lcy_ && split -d -b 10m a.txt lcy_

实例3:以行为单位、以lcy.为单位进行切割

split -l 5 a.txt lcy.

以行为单位,每五行切割一次,以lcy.为前缀,后缀为默认,默认从aa开始。

在这里插入图片描述

实例4:以行为单位、以lcy.为单位、并设置后缀为4为数字进行切割

split -l 5 -a 4 -d a.txt lcy.

以行为单位,每五行切割一次,以lcy.为前缀,后缀为数字形式,后缀长为4位数;

在这里插入图片描述

12、diff / vimdiff [多]文本比较

diff / vimdiff 介绍:

diff介绍:

  diff命令来自英文单词“different”的缩写,其功能是用于比较文件内容差异。如果有多个内容相近的文件,如何快速定位到不同内容所在位置?此时用diff命令就再合适不过了~!

vimdiff介绍:

  vimdiff命令来自英文词组“Vim differences”的缩写,其功能是用于同时编辑多个文本文件。对纯文本文件的比较和合并工具一直是软件开发过程中比较重要的组成部分,vimdiff命令能够比较多个文本文件之间的差异并快速定位,并很容易地进行文件合并操作。

diff的区别和vimdiff的区别:

  • diff 是可以直接将不同的文件输出出来,就是对于新手不友好,看不出来是哪个文件少东西或者不一样,而且diff最多支持两个文件做比较。
  • vimdiff 是可以清晰的看出哪个文件少什么东西,或者是那行和哪行不一样,非常的清晰,而且还支持多文件比较,是非常友好的,但是就是退出有点麻烦,必须执行:q!退出。
  • 总结及推荐 各有各的好,但我还是推荐使用 vimdiff

在这里插入图片描述

diff / vimdiff 格式:

diff [参数] 文件名1 文件名2
vimdiff [参数] 文件名1 文件名2 [文件名N]

diff / vimdiff 实例:

实例1:diff 比较两个文件

diff a.txt b.txt

看不出来是哪个少东西,很不友好。

在这里插入图片描述

实例2:vimdiff 比较两个文件

vimdiff a.txt b.txt 

在这里插入图片描述

实例3:vimdiff 比较多个文件

vimdiff a.txt b.txt c.txt

在这里插入图片描述

13、xagrs 给其他命令传参数的过滤器

将字符结果转化为参数传递个后命令,通常与管道连用

xagrs 介绍:

  xargs命令来自英文词组“extended arguments”的缩写,其功能是用于给其他命令传递参数的过滤器。xargs命令能够处理从标准输入或管道符输入的数据,并将其转换成命令参数,也可以将单行或多行输入的文本转换成其他格式。
  xargs命令默认接收的信息中,空格是默认定界符,所以可以接收包含换行和空白的内容。

xagrs 格式:

xargs [参数] [文件名]
命令 | xargs [参数]

常用参数:

参数解析
-a设置从文件中读取数据
-d设置自定义定界符
-I设置替换字符串
-n设置多行输出;将标准输出的文本内容,多行转换一行,默认是空格隔开
-p执行命令前询问用户是否确认
-r如果输入数据为空,则不执行
-s设置每条命令最大字符数
-t显示xargs执行的命令
-i以大括号保存管道前命令的执行结果

xagrs 实例:

实例1:删除/home/lcy/下的所有的a.txt文件

find /home/lcy/ -name "a.txt" |xargs rm -rf

实例2:删除/application/log/下的一天前的日志,类型为目录

find /application/log/ -mtime +0 -type d | xargs rm -rf

实例3:默认以空格为分割符,以多行形式输出文件内容,每行显示三段内容值:

cat a.txt | xargs -n 3

实例4:指定字符:为定界符,默认以单行的形式输出字符串内容:

cat a.txt | xargs -d ":"

在这里插入图片描述

14、rev 将文件中的每行内容反序输出(以列为单位)

rev 介绍:

使用rev命令可以把每一行字符的顺序颠倒过来显示文件内容

cat、tac、rev区别:

cat 为查看文件
tac 为反向查看文件(将文件倒过来看,行从后往前)
rev 文件内容反序输出(以列为单位,列从后往前)

rev 格式:

rev [文件]

rev 实例:

将a.txt每一行字符的顺序颠倒过来显示文件内容:

rev a.txt

在这里插入图片描述

15、shuf 产生随机的排列(指定输出内容,随机输出没有顺序)

shuf 介绍:

shuf命令将输入的内容随机排列并输出。 shuf命令当没有文件或文件为-时,读取标准输入。

shuf 格式:

shuf [参数] 

常用参数:

参数解析
-e将每个ARG视为输入行
-r重复输出行 [可以重复]
-n指定输出多少行
-i将数字范围LO(最低)到HI(最高)之间的作为输入行

shuf 实例:

实例1:打乱顺序输出1-10

shuf -i 1-10	

在这里插入图片描述

实例2:打乱顺序输出1-10并只显示5行

shuf -n 5 -i 1-10

在这里插入图片描述

实例3:模拟硬币抛掷,获取前10个结果:

shuf -r -n 10 -e "正面" -e "反面"

在这里插入图片描述

实例4:模拟体彩超级大乐透:

shuf -i 1-35 -n 5 | sort -n && shuf -i 1-12 -n 2 | sort -n

在这里插入图片描述

16、Shell脚本的调式

方法一:set 方式

  • 可以在脚本中使用调式,在脚本中可以使用全部调式也可以只调试自己想要的部分;(有调试少部分代码时会使用)
  • 可以在执行脚本时使用调试。(个人习惯使用)

bash
-n 将脚本读取一次,用于检测语法错误;
-x 执行每一条命令和结果依次打印;
-v 一边执行脚本,一边打印脚本。

测试:

脚本内容:

#!/bin/bashemail=$(netstat -lnt | grep 25 | wc -l)if [ $email -ge 1 ];thenecho "端口已开启"
elseecho "端口未开启"
fi

脚本 外 使用调式

-x 打印出执行脚本的过程

sh -x cs.sh

在这里插入图片描述

很清晰可以看到每一步执行的操作;

-n 测试脚本语法是否有问题

sh -n cs.sh

我们来修改一下脚本,将脚本的if判断的;分号去掉测试;

在这里插入图片描述

-v 一边执行脚本,一边打印脚本

在这里插入图片描述

脚本 内 使用调式

-x 打印出执行脚本的过程

如果对某一段进行调试,在那一段前面加一个set -x,后面加set +x。

if [ 1 -eq 1 ];thenset -x #检测secho0set +x #禁止检测
fi

如果是全局调式,可以直接在最上面加个set -x

#!/bin/bash#调式
set -x if [ 1 -eq 1 ];thenecho 0
fi

在这里插入图片描述

-n 测试脚本语法是否有问题

#!/bin/bash#调式
set -n if [ 1 -eq 1 ];thenecho 0
fi

在这里插入图片描述

0 则为上条命令成功没有报错;

-v 一边执行脚本,一边打印脚本

#!/bin/bash#调式
set -v if [ 1 -eq 1 ];thenecho 0
fi

在这里插入图片描述

方法二:bashdb 第三方调试工具

bashdb是一个类GDB的调试工具,使用GDB的同学使用bashdb基本无障碍
bashdb可以运行断点设置、变量查看等常见调试操作 (这是非常好的一个功能)

bashdb需要单独安装

bashdb的安装

#拉取安装包
wget https://sourceforge.net/projects/bashdb/files/bashdb/4.4-0.94/bashdb-4.4-0.94.tar.gz

在这里插入图片描述

如果出现这个报错,可以在最后添加-no-check-certificate

在这里插入图片描述

#解压压缩包
tar xf bashdb-4.4-0.94.tar.gz
#进入解压目录
cd bashdb-4.4-0.94
#编译
./configure

在这里插入图片描述

如果出现此报错,说的时没有编译环境,需要安装一下gcc gcc-c++命令,编译环境;

yum -y install gcc gcc-c++

安装完再次编译即可;

在这里插入图片描述

这样就编译完成了。

#安装
make && make check && make install 

安装完成之后,查看版本

bashdb --version

在这里插入图片描述

这样就安装完成了;

bashdb的使用

使用方法:

bashdb --debug 脚本名

常用参数:

一、列出代码和查询代码类:
l  列出当前行以下的10行
-  列出正在执行的代码行的前面10行
.  回到正在执行的代码行
w  列出正在执行的代码行前后的代码
/pat/ 向后搜索pat
?pat?向前搜索pat二、Debug控制类:
h     帮助
help  命令 得到命令的具体信息
q     退出bashdb
x     算数表达式 计算算数表达式的值,并显示出来
!!    空格Shell命令 参数 执行shell命令
使用bashdb进行debug的常用命令(cont.)三、控制脚本执行类:
n   执行下一条语句,遇到函数,不进入函数里面执行,将函数当作黑盒
s n 单步执行n次,遇到函数进入函数里面
b   行号n 在行号n处设置断点
del 行号n 撤销行号n处的断点
c   行号n 一直执行到行号n处
R   重新启动当前调试脚本
Finish 执行到程序最后
cond n expr 条件断点

具体怎么用,我也没用过,大家可以去百度查一下;后续如果有用到的话我会补齐的!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/81864.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【iPhone】手机还有容量,拍视频却提示 iPhone 储存空间已满

文章目录 前言解决方案 结语 前言 今天在用 iPhone 录像的时候突然提醒我 iPhone储存空间已满 你没有足够的储存空间来录制视频” 可我明明还有 20G 的容量 我非常疑惑&#xff0c;因为我之前还剩1个G都能录像&#xff0c;现在20G反而不行了&#xff0c;于是重启了手机&#…

怎么在JMeter中的实现关联

我们一直用的phpwind这个系统做为演示系统, 如果没有配置好的同学, 请快速配置之后接着往下看哦. phpwind发贴时由于随着登陆用户的改变, verifycode是动态变化的, 因此需要用到关联. LoadRunner的关联函数是reg_save_param, Jmeter的关联则是利用后置处理器来完成. 在需要查…

在线高精地图生成算法调研

1.HDMapNet 整体的网络架构如图所示&#xff0c;最终的Decoder输出三个分支&#xff0c;一个语义分割&#xff0c;一个embedding嵌入分支&#xff0c;一个方向预测。然后通过后处理将这些信息处理成向量化的道路表示。 img2bev的方式之前有IPM&#xff0c;通过假设地面的高度都…

vue新学习 05vue的创建运行原理(vue的生命周期)

01.vue的创建过程 原理解释&#xff1a; 1.定义&#xff1a; 1.Vue的生命周期是指Vue实例从创建到销毁的整个过程中经历的一系列阶段&#xff0c;Vue在关键时刻帮我们调用的一些特殊名称的函数。 2.生命周期函数的名字不可更改&#xff0c;但函数的具体内容是程序员根据需求…

Linux线程同步(条件变量)

文章目录 前言一、条件变量概念二、条件变量相关的函数三、条件变量模拟生产者消费者模型四、使用条件变量的好处总结 前言 本篇文章来讲解一下条件变量的使用。 一、条件变量概念 条件变量&#xff08;Condition Variable&#xff09;是并发编程中一种线程同步机制&#xf…

如何在页面中嵌入音频和视频?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 嵌入音频⭐ 嵌入视频⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏…

如何实现 Java SpringBoot 自动验证入参数据的有效性

Java SpringBoot 通过javax.validation.constraints下的注解&#xff0c;实现入参数据自动验证 如果碰到 NotEmpty 否则不生效&#xff0c;注意看下 RequestBody 前面是否加上了Valid Validation常用注解汇总 Constraint详细信息Null被注释的元素必须为 nullNotNull被注释的元…

chatGLM 本地部署(windows+linux)

chatGLM算是个相对友好的模型&#xff0c;支持中英文双语的对话交流&#xff0c;清华出的 我的教程无需特别的网络设置&#xff0c;不过部分情况因为国内网络速度慢&#xff0c;需要反复重复 chatGLM github地址 一、硬件需求 N卡8G显存以上&#xff0c;最好16G以上&#xff…

AI 绘画Stable Diffusion 研究(六)sd提示词插件

大家好&#xff0c;我是风雨无阻。 今天为大家推荐一款可以有效提升我们使用 Stable Diffusion WebUI 效率的插件&#xff0c; 它就是 prompt-all-in-one&#xff0c; 它不但能直接将 WebUI 中的中文提示词转换为英文&#xff0c;还能一键为关键词加权重&#xff0c;更能建立常…

公众号外包开发框架

公众号开发框架主要指的是在微信公众号平台上开发应用的技术框架。微信公众号是一种基于微信平台的应用&#xff0c;分为订阅号、服务号和企业号&#xff08;现在称为企业微信&#xff09;等不同类型。以下是一些常见的公众号开发框架以及它们的特点&#xff0c;希望对大家有所…

【Hystrix技术指南】(5)Command创建和执行实现

创建流程 构建HystrixCommand或者HystrixObservableCommand对象 *使用Hystrix的第一步是创建一个HystrixCommand或者HystrixObservableCommand对象来表示你需要发给依赖服务的请求。 若只期望依赖服务每次返回单一的回应&#xff0c;按如下方式构造一个HystrixCommand即可&a…

hive修改表或者删除表时卡死问题的解决(2023-08-08)

背景&#xff1a;前阶段在做hive表的改表名时&#xff0c;总是超时&#xff0c;表是内部表&#xff0c;数据量特别大&#xff0c;无论你是修改表名还是删除表都是卡死的状态&#xff0c;怎么破&#xff1f; 终于&#xff1a;尝试出来一个新的方法 将内部表转化成外部表&#…

pytest之测试用例执行顺序

前言 在unittest框架中&#xff0c;默认按照ACSII码的顺序加载测试用例并执行&#xff0c;顺序为&#xff1a;09、AZ、a~z&#xff0c;测试目录、测试模块、测试类、测试方法/测试函数都按照这个规则来加载测试用例。 而 pytest 中的用例执行顺序与unittest 是不一样的&#…

string模拟实现:

string模拟实现&#xff1a; 上一篇博客&#xff0c;我们对String类有了一个基本的认识&#xff0c;本篇博客我们来从0~1去模拟实现一个String类&#xff0c;当然我们实现的都是一些常用的接口。 ❓我们这里定义了一个string类型&#xff0c;然后STL标准库里面也有string&#…

[C#] 简单的俄罗斯方块实现

一个控制台俄罗斯方块游戏的简单实现. 已在 github.com/SlimeNull/Tetris 开源. 思路 很简单, 一个二维数组存储当前游戏的方块地图, 用 bool 即可, true 表示当前块被填充, false 表示没有. 然后, 抽一个 “形状” 类, 形状表示当前玩家正在操作的一个形状, 例如方块, 直线…

测试 tensorflow 1.x 的一个demo 01

tensorflow 1.0的示例代码 demo_01.py import tensorflow as tf import os os.environ[TF_CPP_MIN_LOG_LEVEL]2def tf114_demo():a 3b 4c a bprint("a b in py ",c)a_t tf.constant(3)b_t tf.constant(4)c_t a_t b_tprint("TensorFlow add a_t b_t &…

海外直播种草短视频购物网站巴西独立站搭建

一、市场调研 在搭建网站之前&#xff0c;需要进行充分的市场调研&#xff0c;了解巴西市场的消费者需求、购物习惯和竞争情况。可以通过以下途径进行市场调研&#xff1a; 调查问卷&#xff1a;可以在巴西市场上发放调查问卷&#xff0c;了解消费者的购物习惯、偏好、购买力…

使用langchain与你自己的数据对话(五):聊天机器人

之前我已经完成了使用langchain与你自己的数据对话的前四篇博客&#xff0c;还没有阅读这四篇博客的朋友可以先阅读一下&#xff1a; 使用langchain与你自己的数据对话(一)&#xff1a;文档加载与切割使用langchain与你自己的数据对话(二)&#xff1a;向量存储与嵌入使用langc…

docker容器监控:Cadvisor +Prometheus+Grafana的安装部署

目录 Cadvisor PrometheusGrafana的安装部署 一、安装docker&#xff1a; 1、安装docker-ce 2、阿里云镜像加速器 3、下载组件镜像 4、创建自定义网络 二、部署Cadvisor 1、被监控主机上部署Cadvisor容器 2、访问cAdvisor页面 三、安装prometheus 1、部署Prometheus…