马哥第二周作业

文件和文本

总结文件查找工具find,文本处理工具,文本处理三剑客, 文本格式化命令(printf)的相关命令及选项,示例。

文件查找工具

find 命令
find 路径(/,/root/)  -name linu* #在/路径下,查找包含linux的文件
find / -name linux*
	-type (d,f,_,)指定文件类型
	-size 20GB (文件+大于, -小于)
	-mtime -7(7天内修改改的过的文件) +30超过30天修改过的文件.
#多条件组合查询,
find / -name *sh -type f -size -1GB
#复制匹配到的文件到目标目录
find /path/to/directory -name "*.log" -exec cp {} /path/to/destination \;
#删除匹配到到文件
find / -name "*.bak" -delete

文本格式化 printf的常见用法

printf命令
printf [-v var] format [arguments]# 1)将字符串输出到变量,而不是打印至终端.
var=$(printf "this is the printf command result"),# 这用法变量赋值有本质区别var1="result" 
选项: -v 指定存储结果的变量
printf -v var "hello,world!"

#格式化参数并输出
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg   
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
%-s %f %c %d 都是格式替代符,%s输出一个字符串,%c表示输出一个字符,%f表示输出实数,%d输出整形,-表示左对齐,.2表示保留两位小数.

# 选项中使用单引号和双引号,等效
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 与 printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234

如果没有参数,那么%s用null代替,%d用0代替
printf "a中<%b>c" "b" 
printf的转义
\a 警告字符,\b后退,\c抑制,\f换页,\r回车,\t水平制表符,\v垂直制表符,\\反斜杠

文本查看工具 cat less more tail

cat 选项 文件名称
	-n 对输出编号
	-b 空白好不编号
	-s 压缩空白行

less 参数 文件
	-b设置缓冲区大小
	-e 文件显示结束时,退出
	-f 强行打开
	-g 至标记最后搜索的关键字
	-i 忽略大小写
	-s 压缩空白行
	b向上翻一页,d后翻半页,q退出,空格 滚动一页

tail 选项 文件名
	-n k 输出最后k行
	-c k 输出最后k字节
	-f 输出增量数据,用于跟踪文件编号

wc 命令

wc 选项 文件
	-c 统计字节数
	-l 行数
	-w 字数
	-L 最长行的长度

find  . * | xargs wc -l # 当前目录以及子目录的所有文件行数及总计行数。

wc -l * #统计当前目录下的所有文件行数及总计行数

tr命令

选项 参数 字符集1 字符集2
	不接参数选项,就是转换
-c 取代所有不属于第一个字符集的字符
-d 删除所有属于第一个字符集的字符
-s 连续字符压缩为一个
-t 先删除第一个字符较第二个字符多出的字符

1)大写转换为小写
echo "HELLO WORLD" | tr 'A-Z' 'a-z'
echo txt |tr '\t' '' #将制表符转换为空格 

文本三剑客之sed

sed命令,本质上是一个预先定义好处理规则的,进行流编辑的行处理文本工具.

他有几个特性,1)一次只读取并处理一行.2)根据规则匹配并使用命令修改数据.并将结果存入缓冲区,不对源文件直接修改.3)并将结果输出,并重复执行.

命令基本格式

sed 选项[-ihnV] 脚本[-e<script>] [-f<script文件>] 文件[文本文件]
	-e 可以指定多个编辑操作
	-f #指定脚本或者规则.
	-i # 将执行结果直接写入源文件,慎用

sed s脚本命令(上述的第三项)

#命令基本格式
[address]s/pattern/replacement/flags #address表示指定要操作的具体行,pattern指的是需要替换的内容,replace指的是要替换的新内容.

flags标记

flags标记 功能 举例
n 1~512之间的数字,表示指定要替换的字符串出现第几次时替换,如替换掉第2个A
g 全局,即匹配到的所有内容替换,没有g就替换第一次,
p 打印与替换命令中指定的模式匹配的行,通常与-n一起使用 sed -n 's/test/trial/p' data5.txt. -n 选项会禁止 sed 输出,但 p 标记会输出修改过的行,将二者匹配使用的效果就是只输出被替换命令修改过的行
w file 将缓冲区的内容写入到file文件中
& 用正则表达式匹配的内容进行替换
\n 匹配第n个子串,改子串之前在pattern中用()指定
\ 转义(转义替换部分包含:& \等)

sed d替换脚本命令

基本格式 [address]d

1) sed 'd file.txt #它会删除指定行中的所有内容,会清空文件.
2) sed '2,3d' file.txt #删除文件中的第2,3行
3) sed '/1/,/3/d' file.txt #删除第一行,到第3行的数据

sed a 和 i 脚本命令

a命令,表示在指定行后面附加一行,i表示从前面插入一行,格式基本一致.
格式[address]a(或i)\新文本内容

sed '3i\this the inserted line' file.txt #第三行前插入
sed '3a\this the inserted line' file.txt #第三行后面插入

sed c 替换脚本命令

c 命令表示将指定行中的所有内容替换成改选项后面的字符串,其基本格式为

[address]c\n

sed '3c\替换内容' file.txt
sed '/number 3/c\this is a change line'  file.txt

sed y 转换脚本命令

转换命令是唯一处理单个字符的sed脚本命令,基本格式如下

[address]y/inchars/outchars/

sed q 脚本命令

sed '2q' test.txt 处理到第二行后,就退出
sed '/number 1/{ s/number 1/number 0/;q; }' test.txt # 匹配number1时,替换成number 0,然后直接退出.

sed脚本命令的寻址方式(匹配行)

​ sed命令默认匹配所有行,如果将脚本(命令规则)作用于指定行,写明address部分.有两种形式,1.数字指定行区间,2文本模式指定具体行区间.

数字模式指定行区间

sed '2s/dog/tom/' file.txt #将第2行中的dog替换为tom.
sed '2,$s/dog/tom/'  file.txt # 从第2行开始,$后面所有行,$表示末尾.

文本模式指定行区间

/pattern/command

sed '/demo/s/bash/tcsh/'   file.txt #匹配到demo行的,将bash替换为tcsh

可以将匹配模式写入一个script文件,在匹配模式中引入脚本,实现变更

# 源文本内容
<body>
h1Helloh1
h2Helloh2
h3Helloh3
</body>

# 编写匹配及操作规则脚本
~]# cat sed.sh
/h[0-9]/{
    s//<&>/1
    s//\<\/&\>/2
}

# 执行编辑操作
~]# sed -f sed.sh test.txt
<h1>Hello</h1>
<h2>Hello</h2>
<h3>Hello</h3>

sed 脚本命令的总结

a\ # 在当前行下面插入文本。
i\ # 在当前行上面插入文本。
c\ # 把选定的行改为新的文本。
d # 删除,删除选择的行。
D # 删除模板块的第一行。
s # 替换指定字符
h # 拷贝模板块的内容到内存中的缓冲区。
H # 追加模板块的内容到内存中的缓冲区。
g # 获得内存缓冲区的内容,并替代当前模板块中的文本。
G # 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l # 列表不能打印字符的清单。
n # 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N # 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p # 打印模板块的行。
P # (大写) 打印模板块的第一行。
q # 退出Sed。
b lable # 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
r file # 从file中读行。
t label # if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label # 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file # 写并追加模板块到file末尾。  
W file # 写并追加模板块的第一行到file末尾。  
! # 表示后面的命令对所有没有被选定的行发生作用。  
= # 打印当前行号码。  
# # 把注释扩展到下一个换行符以前。  

文本三剑客之grep

基本命令格式: grep 选项 模式 文件名称
grep "pattern" file.txt file2.txt
#其中pattern表示模式匹配,正则表达式.

#选项
	-c 列出包含模式的行数,统计有多少行
	-i 忽略大小写
	-l 列出带有匹配行的文件名
	-n 每一行的前面列出行号
	-v 列出没有匹配模式的行
	-w 把表达式当做完整单字符串,忽略部分匹配的行

1)通配符
	c* 匹配0个(空白)或者多个c字符,c表示任意字符
	. 任何一个字符
	[xyz] 匹配其中一个字符
	[^xyz] 匹配除了方括号中的以外的所有字符
	^ 锁定行开头
	$ 锁定行结尾
2)正则中
	+ - * / { ( ) 都需要转义才能正常使用

文本编辑工具vim

分几种模式,命令行模式,最后行模式(扩展的命令行),编辑模式

i 光标所在处插入
o 开起新行,行首插入
方向键可以上下移动贯标
home/end +ctl 可以移动文章最末尾,最首
pageup /pagedown 上下翻页


# 移动光标至需要复制的位置,按压v,按下y来复制,移动光标至要粘贴的位置,p复制.

文本处理之****单行重定向(追加)

输入和输出重定向,分别用< >来表示,0标准输入,1标准输出,2标准错误信息输出
echo "hello" > a.txt
echo hello >> a.txt #将hello字符串追加至a.txt文件中.
echo hello 2>&1 将错误信息重定向到标准输出.
ll >/dev/null 2>&1 

1> > 等效,输出重定向
2> 错误重定向,报警,提示
&> 所有包括1 2

合并重定向
() {}  #例如: (date;ll;)

~]# ls /data/ /err 2> /data/all 1>&2

多行文本重定向(多行追加)

cat >>date <<EOF
123
12
11
10
09
08
07
EOF
tee命令
#将多行文本输入进date.sh文件中,并在屏幕中打印
cat <<EOF |tee date.sh
123
231
321
112
132

修改别人的密码(静默更改)
cat pass.txt | passwd --stdin root &> /dev/null

总结变量命名规则,不同类型变量(环境变量,位置变量,只读变量,局部变量,状态变量)如何使用。

变量的命名规则(或者规范): 可以包含大小写字母,数字,下划线,不能包含其他特殊字符.变量名称大小写敏感.要避免使用shell保留字,if else,then, for, fi ,while,空格,特殊字符.

# 变量的定义和赋值
var=123; 注意不能留空格写成 var = 123,这个变成var 和 123比对了.不是变量赋值.
# 隐式赋值
for file in $(ls /root) 每循环一次,向file赋值一次.


#变量的使用
echo $file
echo ${your_name} ,此花括号,不是必选项,主要用于帮助解释器识别变量边界.

变量类型

字符串类型
str=1223
str='1233'
str="1233"

整数变量
integer=123
declare -i integer=123  使用的是typeset或者declare命令,可以指明变量类型

数组变量
arr=(1 2 3 4 5)
arr[0]="1"
arr[2]="3"

关联数组(下标是特定有意义的字符)不是数字
arr[age]=12

#环境变量
echo $PATH

特殊变量
$0 表示脚本名称
$1 脚本参数 $2 脚本参数
$# 表示传递给脚本的参数数量
$? 上一条命令的退出状态
  1. 通过shell编程完成,30鸡和兔的头,80鸡和兔的脚,分别有几只鸡,几只兔?

    鸡兔同笼问题
    采取一个for循环
    
    #设i=1,鸡的数量
    #!/bin/bash
    i=1
    while [ $i -lt 30 ]
    do
        result=$((i*2 + (30-i)*4))
        if [ $result -ne 80 ] ;then
            let i++
            else
              echo '鸡:'$i "兔子": $((30-$i))
              break
         fi
    done
    
  2. 结合编程的for循环,条件测试,条件组合,完成批量创建100个用户,
    1)for遍历1..100
    2)先id判断是否存在
    3)用户存在则说明存在,用户不存在则添加用户并说明已添加。

    for ((i=1;i<=100;i++));
    do
    	echo $i
    	[ id $i ] && echo "user" $i "already cunzai" || useradd $i
    done
    
  3. 磁盘存储术语总结: head, track, sector, sylinder.

    head : 机械硬盘的扫描头
    track : 磁盘上的圆形环
    sector : 磁盘存储的最小单位,是对磁道的分组,扇区通常固定
    分区: 就是扇区的集合
    sylinder : 多个盘面相同位置的磁道组成的垂直堆叠.
    block: 文件系统的最小单位块
    pe: lvm逻辑卷的基本单位
    
  4. 总结MBR,GPT结构。

    # 他们都是磁盘分区方案: 
    MBR第一扇区总512字节,446mbr用于引导相关,64字节dpt分区表.2^32即2T.
    GPT分区: 亦GUId分区表,
    
    
  5. 总结学过的分区,文件系统管理,SWAP管理相关的命令及选项,示例
    fdisk, parted, mkfs, tune2fs, xfs_info, fsck, mount, umount, swapon, swapoff


lsblk #列出磁盘的块设备信息, -a所有设备,-f显示文件系统信息
blkid #块设备上所有文件系统查询.

fdisk -l #分区信息查看
df -Tha #查看已经挂载文件系统的使用情况.

fdisk命令与parted命令分区.前mbr,后用于gpt分区.

# 创建文件系统
mkfs
	~]$ mkfs.ext4 /dev/sda1
	    mkfs.ntfs /dev/sda1

tune2fs命令是用于调整和修改ext2、ext3和ext4文件系统的参数和属性的命令行工具。它可以用于更改文件系统的相关设置,例如调整文件系统的挂载选项、更改文件系统的标签、设置文件系统检查间隔等。

xfs_info /dev/sda1 #查询xfs文件系统

# fsck
用于检查和修复文件系统错误的命令行工具。它可以扫描文件系统并查找任何损坏的文件、目录或其他数据,并尝试修复这些错误。

挂载/卸载,启用swap/禁用swap

文本三剑客之awk 本节可以做一个专题,结合正则表达

略;**正则表达式**
2. 总结文本处理的grep命令相关的基本正则和扩展正则表达式。
posted @ 2023-12-04 11:21  蜜猿  阅读(44)  评论(0)    收藏  举报