xml地图|网站地图|网站标签 [设为首页] [加入收藏]
来自 关于我们 2019-10-16 13:01 的文章
当前位置: 新濠国际登录平台 > 关于我们 > 正文

新濠国际登录平台偶然看见在linux中的cat命令似乎

要做一项工作,内容是将一个word中的图表复制到多个(接近300个)word文档的末尾,不想一个个CTRL C+CTRL V,就想到了用程序来实现

很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等。例如,从路径/dir1/dir2/file.txt中提取也文件名file.txt,提取出目录/dir1/dir2,提取出文件后缀txt等。

昨天在往github上面push东西的时候,突然感觉我真是太蠢了,一个学计算机的,居然没有想到把三个命令集成在一个shell脚本里面。通过传入俩个参数,一个文件名,一个关于的递交的信息,这样不就一条命令就好了,还省了很多的事。但是准备写的时候,发现不怎么会使用shell编程,所以查阅了一些资料,决定写一篇关于shell编程的文章吧。这样,即使以后我忘记了,也可以方便查阅。最后,这篇文章是为了那些不会shell,或者不这么熟悉shell的同学,方便以后批处理文件,或者其他的事情。

我第一个想到的使用python来实现,由于技术太渣,尝试了多次,没能写出来,只记得有一个叫做win32com的模块,专门处理文档的。这里先不说了

下面介绍两种常用的方法来进行相关的操作。

介绍shell脚本

简单的说shell就是一个包含若干行Shell或者Linux命令的文件。对于一次编写,多次使用的大量命令,就可以使用单独的文件保存下来,以便日后使用。通常shell脚本以.sh为后缀。在编写shell时,第一行一定要指明系统需要哪种shell解释用户的shell程序,如:#!/bin/sh(Bourne Shell),#!/bin/bash(Bourne Again Shell),#!/bin/csh(C Shell),#!/bin/ksh(K Shell)等等。

不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种 就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。下面的run.sh则指明使用bash执行。

#!bin/bash
ls -l

通常,shell脚本会以#!/bin/sh作为默认的shell程序。执行shell的方式有两种:第一种是通过sh命令执行shell脚本,第二种是为shell脚本加上可执行权限并执行,例如执行当前目录下的run.sh脚本,命令如下:

1.通过sh命令执行shell脚本

sh run.sh

2.为shell脚本直接加上可执行权限并执行

chmod +x run.sh
./run.sh

chmod [who] operator [permission] filename

who的含义是:
u 文件属主权限。
g 同组用户权限。
o 其他用户权限。
a 所有用户(文件属主、同组用户及其他用户)。

operator的含义:
+ 增加权限。
- 取消权限。
= 设定权限。

permission的含义:
r 读权限。
w 写权限。
x 执行权限。
s 文件属主和组s e t - I D。
l 给文件加锁,使其他用户无法访问。
文 件 属 主 同 组 用 户 其 他 用 户
r w x r w x r w x
4 + 2 + 1 4 + 2 + 1 4 + 2 + 1

在查阅资料的过程中,偶然看见在linux中的cat命令似乎能做这件事,恰好我装了centos7,也在学习这Linux命令,于是转战linux。

一、使用${}

shell 使用

对这个工作,我分三步进行:

1、${var##*/}
该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。使用例子及结果如下:

参数传递

$xxx 表示包括$0在内的命令行参数的个数。在Shell中,脚本名称本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表。
例:显示文件的内容123 456.txt

#!bin/bash
cat "$1"

有人可能会问,为什么要加",因为不加的话,执行指令时会解析成cat 123 456.txt而不是cat 123 456.txt,所以如果参数中有空格,就加上"吧。

#!/bin/sh
#print hello world in the console window
a = "world"
echo "hello, $a"    #输出    :hello world
echo "hello, $as"   #希望输出:hello worlds

echo "Hello, $as" 就不会输出“hello, worlds”,而是输出“hello, ”。这是因为Shell把$as当成一个变量,而$as未被赋值,其值为空。正确的方法是:
echo "Hi, ${a}s"

1:使用cat命令将一个文档追加到另一个文档末尾

新濠国际登录平台 1

基本控制语句

# if语句和其他编程语言相似,都是流程控制语句
if …; then
…
elif …; then
…
else
…
fi

# 在循环中,也可以使用类似C语言中的break和continue语句中断当前的循环操作。
for var in …; do
…
done

2:得到一个目录下的所有文件名(后面讲为什么)

从运行结果可以看到,使用该命令,可以提取出我们需要的文件名file.txt。

常用条件测试

[ -f "$file"     ] 判断$file是否是一个文件
[ $a -lt 3       ] 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于
[ -x "$file"     ] 判断$file是否存在且有可执行权限,同样-r测试文件可读性
[ -n "$a"        ] 判断变量$a是否有值,测试空串用-z
[ "$a" = "$b"    ] 判断$a和$b的取值是否相等
[ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立

3:   写shell脚本实现功能

若使用时在shell程序文件中,可以使用变量来保存这个结果,再加以利用,如file=${var##*/}

截取文件名信息

#:表示从左边算起第一个
%:表示从右边算起第一个
##:表示从左边算起最后一个
%%:表示从右边算起最后一个
basename 和 dirname

例如:
1、${var##*/}
该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。

#!bin/bash
var = /dir1/dir2/file.txt
echo ${var##*/}
# echo 输出到屏幕
# 输出:file.txt

2、${var%%.*}
该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。

#!bin/bash
var = /dir1/dir2/file.txt
echo ${var%%.*}
# 输出:/dir1/dir2/file

basename
该命令的作用是从路径中提取出文件名,使用方法为basename NAME

dirname
该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME

这俩条命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录。

#!bin/bash
var = /dir1/dir2/file.txt

echo basename $var
# 输出:file.txt

echo dirname $var
#输出:/dir1/dir2

获取某目录下所有文件夹的名称

#!/bin/bash
for dir in $(ls .)
do
    [ -d $dir ] && echo $dir
done 

一:关于cat命令

2、${var##*.}

注释,管道,重定向

1.shell脚本和其它编程语言一样,也拥有注释。注释方法为在注释行前加#号。

#!/bin/sh  
#Filename: comment.sh  

2.管道的作用是在一个命令的标准输出和另一个命令的标准输入之间建立一个通道。例如下面命令就是将ps -aux的标准输出传递给grep作为输入。

#!/bin/sh 
ps -aux | grep httpd

3.输入重定向使用小于号“<”可以实现。输出重定向有两种方式,一种是直接输出,使用一个大于号“>”实现;另一种是以附加的方式输出,使用两个大于号“>>”实现。前者会覆盖原始的输出内容,而后者会添加到文件最后。

#!/bin/sh 
cat < dir.txt   # cat命令重定向到dir.txt文件

ls > dir.txt    # ls命令重定向到dir.txt
ls >> dir.txt   # ls命令以附加的方式重定向到dir.txt

cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。 

该命令的作用是去掉变量var从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起的最后一个'.'(不含该字符)的右边的内容。使用例子及结果如下:

1.命令格式:

新濠国际登录平台 2

  cat [选项] [文件]...

从运行结果可以看到,使用该命令,可以提取出我们需要的文件后缀。

2.命令功能:

如果文件的后缀不仅有一个,例如,file.tar.gz,命令${var##*.}仅能提取最后一个后缀,而我想提取tar.gz时该怎么办?那么就要用下面所说的${var#*.}命令了。

  cat命令的功能:

3、${var#*.}

  1.一次显示整个文件:cat filename  

该命令的作用是去掉变量var从左边算起的第一个'.'字符及其左边的内容,返回从左边算起第一个'.'(不含该字符)的右边部分的内容。使用例子及结果如下:

  2.从键盘创建一个文件:cat > filename  只能创建新文件,不能编辑已有文件.

新濠国际登录平台 3

  3.将几个文件合并为一个文件:cat file1 file2 > file

从运行结果可以看到,使用该命令,可以提取出文件的多个后缀。

  4.在一个文件后追加另一个文件:cat file1 >> file2

4、${var%/*}

3.命令参数:

该命令的使用是去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容。使用例子及结果如下:

  -A, --show-all           等价于 -vET

新濠国际登录平台 4

  -b, --number-nonblank    对非空输出行编号

从运行的结果可以看到,使用该命令,可以提取出我们需要的文件所在的目录

  -e                       等价于 -vE

5、${var%%.*}

  -E, --show-ends          在每行结束处显示 $

该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。使用例子及结果如下:

  -n, --number     对输出的所有行编号,由1开始对所有输出的行数编号

新濠国际登录平台 5

  -s, --squeeze-blank  有连续两行以上的空白行,就代换为一行的空白行 

当我们需要建立一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可以使用该命令来进行操作。例如,解压文件的情况就与此类似,我们压缩文件file.zip时,会在与file.zip同级目录下建立一个名为file的目录。

  -t                       与 -vT 等价

6、${}总结

  -T, --show-tabs          将跳格字符显示为 ^I

其实${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的'/'或'.'。也就是说,上面的使用方法只是它使用的一个特例。

  -u                       (被忽略)

看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。

  -v, --show-nonprinting   使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外

#:表示从左边算起第一个

这里给出几个实例:

%:表示从右边算起第一个

1:把 file1 的文档内容加上行号后输入 file2 这个文档里

##:表示从左边算起最后一个

cat -n file1 > file2

%%:表示从右边算起最后一个

新濠国际登录平台,注意这里是吧file1的内容输入到file2中,file2若存在,则清空内容,里面输入file1内容,若不存在则创建file2,输入file1内容

换句话来说,#总是表示左边算起,%总是表示右边算起。

2:把 file1 和 file2 的文档内容加上行号(空白行不加)之后将内容追加到 file3 文档里:

*:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。

cat -b file1 file2 >>file3

例如:${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。

该操作不会改变file3中原有的内容,把file1和file2的内容追加到file3的末尾

看到这里,就可以知道,其实该命令的用途非常广泛,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。

3:创建一个名为a.txt的文件

二、basename和dirname

cat >a.txt <<EOF
>EOF

${}并不是专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为做这一件事而已准备的了。

 输入第一行后,输入EOF,回车,就可以生成一个 a.txt 文件。其中EOF是告诉 bash 哪个符号代表文件结束。当然你也可以使用自己习惯的符号。

1、basename

4: 利用cat清空文件内容

该命令的作用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。

如果 b.txt 文件有很多内容,而你想要清空的话,同样可以使用上面提到的命令形式:

1)从路径中提出出文件名(带后缀),例子如下:

cat >b.txt << EOF
>EOF

新濠国际登录平台 6

5: cat命令可以直接向文件中写入东西,并覆盖掉原本的东西

2)从上面命令的用法中可以看到,后缀(SUFFIX)是一个可选项。所以,若只想提取出文件名file,而不带有后缀,还可以在变量的后面加上后缀名,例子如下:

cat >c.txt  <<EOF
>2222
>3333
>EOF

新濠国际登录平台 7

利用cat命令处理的时候,尽量带上文件的格式,例如1.txt,1.doc

2、dirname

要是第一步,文件追加需要用到这个命令

该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME

cat file1 >> file2

使用例子如下:

二:获取一个目录下的文件名

新濠国际登录平台 8

 获取目录下的文件名可以直接使用    ls   命令,但只是将名字打印出来,不能获得这个名字,也就是说如果想要在后面使用cat命令对这些文件进行处理的话,需要用一个变量来接收这些文件名,再对这个变量进行cat操作

这样就提取出了file.txt文件所在的目录。

下面介绍两种常用的方法来进行相关操作

注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,如下:

1:使用${ }

新濠国际登录平台 9

${var##*/} 

它提取出了目录dir2所在的目录dir1.

本文由新濠国际登录平台发布于关于我们,转载请注明出处:新濠国际登录平台偶然看见在linux中的cat命令似乎

关键词: