linux格式化目录,Linux中格式化输出

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

目录格式化打印:printf

数据处理工具:awk

文件对比工具:diff cmp patch

文件打印:pr

格式化打印:printf

我们在 bash 中想输出一个表格,但由于每个字段的长度不同,会导致输出的样子像下面这样,很乱,不方便看。1

2

3

4

5Name Chinese English Math Average

DmTsai 80 60 92 77.33

VBird 75 55 80 70.00

Ken 60 90 70 73.33

我们想让表格格式化成下面那样,我们就可以用 printf 命令了。1

2

3

4Name Chinese English Math Average

DmTsai 80 60 92 77.33

VBird 75 55 80 70.00

Ken 60 90 70 73.33

用法1

2

3

4

5

6

7

8

9

10

11

12

13

14

15printf '打印格式' 实际内容

#选项与参数:

#关于格式方面的几个特殊样式:

# a 警告声音输出

# b 倒退键(backspace)

# f 清除屏幕 (form feed)

# n 输出新的一行

# r 亦即 Enter 按键

# t 水平的 [tab] 按键

# v 垂直的 [tab] 按键

# xNN NN 为两位数的数字,可以转换数字成为字符。

#关于 C 程序语言内,常见的变量格式

# %ns 那个 n 是数字, s 代表 string ,亦即多少个字符;

# %ni 那个 n 是数字, i 代表 integer ,亦即多少整数码数;

# %N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数码数,假设我共要十个位数,但小数点有两位,即为 %10.2f 啰!1

2

3

4

5#例 将刚才的print.txt格式换成好看的表格

printf '%st %st %st %st %st n' $(cat printf.txt)

#例 将刚才的print.txt的标题去掉,并将每列固定长度

printf '%10s %5i %5i %5i %8.2f n' $(cat printf.txt | grep -v Name)

printf 另一个用处是将 16 进制显示为 ASCII1

2#例

printf 'x45n'

数据处理工具:awk1awk '条件类型1{动作1} 条件类型2{动作2} ...' filename

内置变量变量名意义NF每一行 ($0) 拥有的字段总数

NR目前 awk 所处理的是“第几行”数据

FS目前的分隔字符,默认是空白键

$N第几个字段1

2#例

last -n | awk '{print $1 "t lines:" NR "t columns:" NF}'

BEGIN 和 END1

2

3

4#例 awk默认分隔符是空格,但现在我们想改成‘:’。我们可以设置FS为‘:’。但下面这样写只有第二行开始生效。

cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "t " $3}

#例 为了让它从第一行就开始生效。可以用BEGIN关键字

cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "t " $3}'

awk 还可以对表内的数据做处理。1

2

3

4

5# pay.txt

Name 1st 2nd 3th

VBird 23000 24000 25000

DMTsai 21000 20000 23000

Bird2 43000 42000 41000

假设我们有上面那个表(pay.txt),想添加一列 Total 做求和。我们可以这样写1

2

3

4

5# 下面的‘>’表示换行。在一个动作内写多个命令可以用回车或‘;’隔开。而且这里定义的total变量可以直接使用,不需要要‘$’

cat pay.txt |

>awk 'NR==1{printf "%10s %10s %10s %10s %10sn",$1,$2,$3,$4,"Total" }

> NR>=2{total = $2 + $3 + $4

> printf "%10s %10d %10d %10d %10.2fn", $1, $2, $3, $4, total}'

awk 动作内{}是支持 if 的,上面的命令也可以写成下面那样1

2

3

4cat pay.txt |

> awk '{if(NR==1) printf "%10s %10s %10s %10s %10sn",$1,$2,$3,$4,"Total"}

> NR>=2{total = $2 + $3 + $4

> printf "%10s %10d %10d %10d %10.2fn", $1, $2, $3, $4, total}'

文件对比工具:diff cmp patch

diff

diff 是比较两个文件间的差异,并以行为单位进行比较。1

2

3

4

5

6

7

8

9# 用法

diff [-bBi] from-file to-file

#选项与参数:

#from-file :一个文件名,作为原始比对文件的文件名;

#to-file :一个文件名,作为目的比对文件的文件名;

#注意,from-file 或 to-file 可以 - 取代,那个 - 代表“Standard input”之意。

#-b :忽略一行当中,仅有多个空白的差异(例如 "about me" 与 "about me" 视为相同

#-B :忽略空白行的差异。

#-i :忽略大小写的不同。

现在有 passwd.old passwd.new 文件。passwd.old 拷贝自/etc/passwd;passwd.new 是在/etc/passwd 的基础上做了修。删除了第四行,并将第六行替换为‘no six line’。1

2

3

4mkdir -p /tmp/testpw

cd /tmp/testpw

cp /etc/passwd passwd.old

cat /etc/passwd | sed -e '4d' -e '6c no six line' > passwd.new

现在我们可以查看新旧的 passwd 的差别了1diff passwd.old passwd.new

diff 还以可以比较两目录下的文件名1diff /etc/rc0.d/ /etc/rc5.d/

cmp

对比两文件,以字节的地位对比,默认仅会输出第一个发现的不同点。1

2

3

4# 用法

cmp [-l] file1 file2

#选项与参数:

#-l :将所有的不同点的字节处都列出来。因为 cmp 默认仅会输出第一个发现的不同点。

patch

该命令可以用来做打补丁的用途,也可以将文件回退到补丁前的状态。

centOS7 默认没有安装 patch 文件,我们需要自己安装。1

2

3

4

5su - #切换到root账户

mount /dev/sr0 /mnt #将安装光盘挂载到/mnt

rpm -ivh /mnt/Packages/patch-2.*

umount /mnt

exit

用法1

2

3

4#更新

patch -pN < patch_file

#还原

patch -R -pN < patch_file

制作补丁文件。以上面的 passwd.old 和 passwd.new 为例。1

2

3

4

5

6#制作补丁文件

diff -Naur passwd.old passwd.new > passwd.patch

#将刚刚制作出来的 patch file 用来更新旧版数据

patch -p0 < passwd.patch

#恢复旧文件的内容

patch -R -p0 < passwd.patch

文件打印:pr1

2#打印/etc/man_db.conf

pr /etc/man_db.conf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值