Task8-Task10
任务8:使用grep和awk从文件中筛选字符串
步骤1:下载周杰伦歌词文本,并进行解压。
用前面介绍的wget命令下载即可,输入命令wget https://mirror.coggle.club/dataset/jaychou_lyrics.txt.zip
,即可完成下载。
若想用wget下载到指定文件夹 则输入wget的-P参数,示例wget -P /usr/local/src http://download.redis.io/releases/redis-4.0.9.tar.gz
如果需要对下载的文件进行重命名,则可以通过 -O 参数指定文件名,需要注意的是,如果重命名中包含路径,那么该路径必须实现创建好。示例 wget http://download.redis.io/releases/redis-4.0.9.tar.gz -O /usr/local/src/redis.tar.gz
(O大写会显示下载进程,o不会)
解压缩
在 Linux 中通常比较常用的是 tar 命令,zip 和 rar 命令则是 Windows 中比较常用。
1.tar命令
# 压缩文件 file1 和目录 dir2 到 test.tar.gz
tar -zcvf test.tar.gz file1 dir2
# 解压 test.tar.gz(将 c 换成 x 即可)
tar -zxvf test.tar.gz
# 列出压缩文件的内容
tar -ztvf test.tar.gz
参数含义
-z : 使用 gzip 来压缩和解压文件
-v : --verbose 详细的列出处理的文件
-f : --file=ARCHIVE 使用档案文件或设备,这个选项通常是必选的
-c : --create 创建一个新的归档(压缩包)
-x : 从压缩包中解出文件
备注:tar 命令其实并不是真的解压缩的处理者,而是使用了 gzip 或者 bzip2 等其它命令来达成,但是 gzip 等命令通常只能处理单个文件,并不方便,所以一般我们都是选择使用 tar 命令间接的完成解压缩。
关于解压命令的详细介绍:https://blog.csdn.net/afei__/article/details/82619843
ps:tar解压zip文件出错,最后使用unzip命令解压
用unzip解压到另外的文件夹下
在 Linux 命令行下,对于把文件解压到一个文件夹下是一个好的做法。这种方式下,所有的提取文件都会被存储到你所指定的文件夹下。如果文件夹不存在,会创建该文件夹。
unzip zipped_file.zip -d unzipped_directory
在vscode中可以直接查看解压后的歌词文件
步骤2:利用grep命令完成以下操作,并输出到屏幕
https://blog.csdn.net/baidu_41388533/article/details/107610827
https://www.runoob.com/linux/linux-comm-grep.html
统计歌词中 包含【超人】的歌词
统计歌词中 包含【外婆】但不包含【期待】的歌词
统计歌词中 以【我】开头的歌词
统计歌词中 以【我】结尾的歌词
grep 命令
grep 的作用是在文件中提取和匹配符合条件的字符串行。命令格式如下
[root@localhost ~]# grep [选项] “搜索内容” 文件名
选项:
-i: 忽略大小写
-n: 输出行号
-v: 反向查找
–color=auto: 搜索出的关键字用颜色显示
示例:
grep一次只能查找一个关键字,多个关键字的话要用 | 连接
① grep -E “word1|word2|word3” file.txt
满足任意条件(word1、word2和word3之一)将匹配。
② grep word1 file.txt | grep word2 |grep word3
必须同时满足三个条件(word1、word2和word3)才匹配。
需要排除 abc.txt 中的 mmm nnn
grep -v 'mmm\|nnn' abc.txt
所以“找出包含外婆但不包含期待的句子”有
“统计歌词中 以【我】开头的歌词,统计歌词中 以【我】结尾的歌词”
步骤3:利用sed命令完成以下操作,并输出到屏幕
https://www.cnblogs.com/JohnLiang/p/6202962.html
- 将歌词中第2行 至 第40行 删除
- 将歌词中 所有【我】替换成【你】
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法
sed命令行格式为:
sed [-nefri] ‘command’ 输入文本
常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。
常用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
详细用法见博客
使用sed "2, 40d" jaychou_lyrics.txt
即可删除歌词文本的第2-40行,使用命令sed -n "/我/p" jaychou_lyrics.txt | sed "s/我/你/g"
即可完成“我”替换为“你”。
任务9:在目录下创建zip和tar压缩文件,并进行解压
任务要点:文件压缩
https://www.cnblogs.com/wxlf/p/8117602.html
- 步骤1:在/home/datawhale目录下在你英文昵称(中间不要有空格哦)的文件夹中,下载https://mirror.coggle.club/dataset/jaychou_lyrics.txt.zip
- 步骤2:使用zip 压缩/home/datawhale目录下在你英文昵称(中间不要有空格哦)的文件夹
- 步骤3:将 /home/datawhale目录下在你英文昵称(中间不要有空格哦)的文件夹,打包为tar格式。
- 步骤4:将 /home/datawhale目录下在你英文昵称(中间不要有空格哦)的文件夹,打包为tar.gz格式。
Linux下的全部的解包和打包命令:
tar
解包:tar zxvf filename.tar
打包:tar czvf filename.tar dirname
gz命令
解压1:gunzip filename.gz
解压2:gzip -d filename.gz
压缩:gzip filename
.tar.gz 和 .tgz
解压:tar zxvf filename.tar.gz
压缩:tar zcvf filename.tar.gz dirname
压缩多个文件:tar zcvf filename.tar.gz dirname1 dirname2 dirname3…
bz2命令
解压1:bzip2 -d filename.bz2
解压2:bunzip2 filename.bz2
压缩:bzip2 -z filename
.tar.bz2
解压:tar jxvf filename.tar.bz2
压缩:tar jcvf filename.tar.bz2 dirname\
bz命令
解压1:bzip2 -d filename.bz
解压2:bunzip2 filename.bz
.tar.bz
解压:tar jxvf filename.tar.bz
z命令
解压:uncompress filename.z
压缩:compress filename
.tar.z
解压:tar zxvf filename.tar.z
压缩:tar zcvf filename.tar.z dirname\
zip命令
解压:unzip filename.zip
压缩:zip filename.zip dirname
先利用wget命令下载链接https://mirror.coggle.club/dataset/jaychou_lyrics.txt.zip
压缩为zip格式:zip huixiang.zip huixiang
压缩为tar格式:tar -czvf huixiang.tar huixiang
压缩为tar.gz格式:tar -czvf huixiang.tar.gz huixiang
出现了三个打包文件
任务10:使用find和locate定位文件
任务要点:文件搜索
https://www.runoob.com/linux/linux-comm-find.htmlhttps://www.cnblogs.com/linjiqin/p/11678012.html
- 步骤1:使用find统计文件系统中以py为后缀名的文件个数
- 步骤2:使用find寻找/home/文件夹下文件内容包含datawhale的文件
- 步骤3:时候用locate寻找到python3.6.1.gz文件
find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
语法:find path -option [ -print ] [ -exec -ok command ] {} \;
find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。
expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。
-mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件
-amin n : 在过去 n 分钟内被读取过
-anewer file : 比文件 file 更晚被读取过的文件
-atime n : 在过去n天内被读取过的文件
-cmin n : 在过去 n 分钟内被修改过
-cnewer file :比文件 file 更新的文件
-ctime n : 在过去n天内被修改过的文件
-empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name
-ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写
-name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写
-size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。
-type c : 文件类型是 c 的文件。
d: 目录
c: 字型装置文件
b: 区块装置文件
p: 具名贮列
f: 一般文件
l: 符号连结
将当前目录及其子目录下所有文件后缀为 .c 的文件列出来:
# find . -name "*.c" # . 代表当前目录
将当前目录及其子目录中的所有文件列出:
# find . -type f
查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们:
# find /var/log -type f -mtime +7 -ok rm {} \;
所以使用命令find . -name "*.py"
就可以查看datawhale目录下的py文件了,
问题要求统计文件数量,用wc
命令,wc(Word Count)
命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。
使用方法
wc [选项]文件...
统计指定文件中的字节数、字数、行数,并将统计结果显示输出。该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数。
命令参数:
-c 统计字节数。
-l 统计行数。
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。
-help 显示帮助信息
–version 显示版本信息
综上,我们使用命令find . -name "*.py" | wc -l
得到需要统计的文件数。
要找到/home文件夹下中包含datawhale的文件需要同时利用find和grep命令,这类问题有着一个统一的模板命令
find 文件目录 -type f |xargs grep "查询内容";
其中xargs命令是将find出的文件夹作为参数传给grep,与Linux中管道有着密切的联系。
所以查找包含datawhale的文件使用命令 find /home -type f | xargs grep "datawhale"
接下来要使用locate
命令找到一个gz文件。
locate
的语法如下:
locate [OPTION] PATTERN...
可选参数为 -i
,含义为忽略大小写。
在最基本的形式中,当没有任何选项时, locate 命令将打印与搜索模式匹配且用户具有读取权限的所有文件和目录的绝对路径。
例如,要搜索名为的文件, .bashrc 您可以键入:
locate .bashrc
输出将包含名称中包含字符串的所有文件 .bashrc 的名称:
/etc/bash.bashrc
/etc/skel/.bashrc
/home/linuxidc/.bashrc
/usr/share/base-files/dot.bashrc
/usr/share/doc/adduser/examples/adduser.local.conf.examples/bash.bashrc
/usr/share/doc/adduser/examples/adduser.local.conf.examples/skel/dot.bashrc
同样的,locate
也支持匹配符查询。
使用命令 locate python3.6.1.gz
直接查找到文件的位置为 /usr/share/man/man1/python3.6.1.gz