《linux Shell 脚本攻略》进阶学习(第二部分)

简介:

第三章 以文件之名
生成任意大小的文件
$ dd if=/dev/zero of=junk.data bs=1M count=1
记录了1+0 的读入
记录了1+0 的写出
1048576字节(1.0 MB)已复制,0.735955 秒,1.4 MB/秒

查找并删除重复文件
条件:删除那些虽然名字不同但内容一模一样的文件
通过文件内容来识别他们,校验和是依据文件内容来计算的,内容相同的文件自然就生成想通的校验和
通过比较校验和来删除重复文件
书本代码有误,补充如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
ls  -lS |  awk  'BEGIN{
getline;getline;
name1=$9;
size=$5
}
{
name2=$9;
if  (size==$5)
{
"md5sum $name1"   | getline;csum1=$1;
"md5sum $name2"   | getline;csum2=$1;
if  (csum1==csum2)
{
print name1;
print name2;
}
};
size=$5;
name1=name2;
}' |  sort  -u > duplicate_files
cat  duplicate_files |  xargs  -I {} md5sum {} |  sort  uniq  -w 32 |  awk  '{ print $2 }'  sort  -u > duplicate_sample
echo  Removing..
comm  duplicate_files duplicate_sample -2 -3 |  tee  /dev/stderr  xargs  rm  -f
echo  Removed duplicates files successfully.
rm  duplicate_sample duplicate_files




以不同的用户运行可执行文件
原理:有一个叫做setuid的特殊文件权限,它允许其他用户以文件所有者的身份来执行文件
chown root.root execu_file
chown +s execu_file
./execu_file
这个文件事实上每次以超级用户来运行
setuid的使用不是无限制的,它只能应用在linux ELFG格式二进制文件上,二不能用于脚本



创建文件不可修改
限制:一旦文件呗设置为不可修改,任意用户包括超级用户都不能删除文件,除非其不可修改的属性被移除


通过查看/etc/mtab文件,很容易找出所有挂载分区的文件系统类型
cat /etc/mtab
/dev/sda1 / ext4 rw,errors=remount-ro 0 0
proc /proc proc rw,noexec,nosuid,nodev 0 0
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
none /sys/fs/cgroup tmpfs rw 0 0
none /sys/fs/fuse/connections fusectl rw 0 0
none /sys/kernel/debug debugfs rw 0 0
none /sys/kernel/security securityfs rw 0 0
udev /dev devtmpfs rw,mode=0755 0 0
devpts /dev/pts devpts rw,noexec,nosuid,gid=5,mode=0620 0 0
tmpfs /run tmpfs rw,noexec,nosuid,size=10%,mode=0755 0 0
none /run/lock tmpfs rw,noexec,nosuid,nodev,size=5242880 0 0
none /run/shm tmpfs rw,nosuid,nodev 0 0
none /run/user tmpfs rw,noexec,nosuid,nodev,size=104857600,mode=0755 0 0
binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc rw,noexec,nosuid,nodev 0 0
gvfsd-fuse /run/user/zhangjianlin/gvfs fuse.gvfsd-fuse rw,nosuid,nodev,user=zhangjianlin 0 0

可以用chattr将文件设置为不可修改
实战演练
将一个文件设置为不可修改
chattr +i file
或者sudo chattr +i file
rm file出错
移除不可修改的属性
chattr -i file


修改文件三个时间
touch -a 更文件访问时间
touch -m 更改文件内容修改时间
touch -d 时间戳

列举文件夹下的类型统计信息
file -b filename
ASXII text

脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
if  [ $ # -ne 1 ];
then
     echo  $0 basepath;
     echo
fi
path=$1
declare  -A statarray
while  read  line;
do
     ftype=` file  -b  "$line" `
     let  statarray[ "$ftype" ]++;
     done < <( find  $path - type  f -print)
                                                                                                                                                                                              
echo  ======== file  types and counts==========
for  ftype  in  "${!statarray[@]}" ;
do
     echo  $ftype : ${statarray[ "$ftype" ]}
done

结果
$ bash filestat.sh .
========file types and counts==========
Bourne-Again shell script, ASCII text executable : 2
empty : 2

原理

while read line
do
  echo $line
done<A  
<A写在最后相当于给整个while do 语句加了一个约束条件,读取文件A里每行至文件尾结束


while read line<A
do
   echo $line
done
<A写在前面,整个while do语句就没有约束条件, 因为 read line<A这个始终为真
表示 不停地  读取A中的第一行,赋值给参数line,然后打印参数line的值.

done< <(find $path -type f -print) 
<(find $path -type f -print)  等同与文件名。只不过他用子进程输出代替文件名

${!statarray[@]} 用于返回一个数组索引列表


第四章。让文本飞

正则表达式入门
更多内容百度

匹配一个ip地址
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}


grep搜索文本

扩展内容
递归搜索包含词的文件
grep "text" . -R -n #开发人员常用的命令

$ grep "bin" . -R -n 
./第三章:42:binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc rw,noexec,nosuid,nodev 0 0
./第三章:66:#!/bin/bash
./second/mvsuffix.sh:1:#!/bin/bash
./second/mvfilename.sh:1:#a!/bin/bash
./touchlearnfiles.sh:1:#!/bin/bash
./第一章.txt:25:#!/bin/bash
./第一章.txt:36:#!/bin/bash
./第一章.txt:45:#!/bin/bash
./第一章.txt:71:#!/bin/bash
./第一章.txt:74:(cd /bin; ls);
./第一章.txt:97:#!/bin/bash
./第一章.txt:117:#!/bash/bin
./第一章.txt:133:line="root:x:0:0:root:root:/bin/bash"
./第一章.txt:178:#!/bin/bash
./first/password.sh:1:#!/bin/bash
./first/dealpasswd.sh:1:#!/bash/bin
./first/dealpasswd.sh:17:line="root:x:0:0:root:root:/bin/bash"
./first/IFSofdiv.sh:1:#!/bin/bash
./first/array_var.sh:1:#!/bin/bash
./first/cilldshell.sh:1:#!/bin/bash
./first/cilldshell.sh:4:(cd /bin; ls);
./first/delaysleep.sh:1:#!/bin/bash
./first/filetest.sh:1:#!/bin/bash
./第二章.txt:160:#a!/bin/bash
./第二章.txt:196:#!/bin/bash
./third/filestat.sh:1:#!/bin/bash
./third/remove_duplicates.sh:1:#!/bin/bash

在grep 搜索中包括或排除文件
只在目录中递归搜索所有的.c .cpp文件:
$ grep  "main()" . -r --include *.{c,cpp}
搜索中排除所有的README文件
$ grep  "main()" . -r 
--exclude "README"



对文件中的行、单词和字符进行迭代
实战
迭代文件中的每一行
while read line;
echo $line;
done < file.txt

每一行的单词
for word in $line
do
echo $word ;
done

迭代一个单词中方的每一个字符
for ((i=0;i<${#word};i++))
do
echo
${word:i:1};
done

${word:start_position:no_of_characters} 返回变量word所包含的字符串中的一个字窜 :重要

cat touchlearnfiles.sh | (while read line; do echo $line; done)

结果:

#!/bin/bash

arrays=("一" "二" "三" "四" "五" "六" "七" "八" "九" "十")
arraynums=(first second third fourth fifth sixth seventh eighth ninth tenth)
read -p "please input the number of caption:" num;

touch "第${arrays[$num-1]}章.txt"
mkdir ${arraynums[$num-1]}

awk打印多列数据,并在列间插入指定的字符
$ ls -l | awk '{ print $1" : " $8 }' 


实战演练:打印不同行或样式之间的文本

打印从第M行到N行这个范围内的所有文本,使用下面语法:
$ awk 'NR==M, NR==N' filename


把M跟N换成数字
$ seq 100 | awk 'NR==4, NR==6'

要打印处于'/start_pattern/,/end_pattern/' filename 



$ cat section.txt
line with pattern1
line with pattern2
line with pattern3
line end with pattern4
line with pattern5

$awk '/pa.*3/, /end/' section
line with pattern3
line end with pattern4

回文判断 最简单的使用命令rev命令
rev 接受一个文件或stdin作为输入,并逆序打印每一行内容
试试下面的代码

1
2
3
4
5
6
7
8
#/bin/bah
string= "malayalam"
if  [[  "$string"  ==  "$(echo $string | rev )"  ]];  #重点
then
echo  "Palindrome"
else
echo  "not palindrome"
fi

解析文本中的点子邮件地址和url
解析email
egrep -o '[A-Za-z0-9.]+@[A-Za-z0-9.]+\.[a-zA-Z]{2,4}'
匹配HTTP URL的正则表达式
egrep -o "http://[a-zA-Z0-9.]+\.[a-zA-A]{2,3}"

http://www.google.com
http://code.google.com
原理
[a-zA-Z0-9.]+ “+”表示应该出现多次

用awk实现head、tail和tac
实战演练
$ awk 'NR <=10' filename
模拟tail命令打印文件的后10行
$ awk '{ buffer[NR % 10] = $0;} END { for(i=1;i<11;i++){print buffur[i%10] } }' filename

文件切片与参数操作
替换变量内容中的部分文本
$ var="this is a line of text"
$ echo ${var/line/REPLACED}
"This is a REPLACED of text"

$name ${name%$1}$2  #${name%\.*} "%"号除去后缀名,只取文件名
${file_name#*.} 只留扩展名或后缀

生成子窜
${variable_name:start_positon:length}

最后一个字符索引记为-1,使用负数索引的话,必须将负数放入括号内,例如(-1)就是最后一个字符的索引
如 
string={a..z}
echo ${string:(-2):2}

yz



本文转自lilin9105 51CTO博客,原文链接:http://blog.51cto.com/7071976/1251296,如需转载请自行联系原作者

相关文章
|
3月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
420 9
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
300 0
Linux系统初始化脚本
|
3月前
|
算法 Linux Shell
Linux实用技能:打包压缩、热键、Shell与权限管理
本文详解Linux打包压缩技巧、常用命令与原理,涵盖.zip与.tgz格式操作、跨系统传文件方法、Shell运行机制及权限管理,助你高效使用Linux系统。
Linux实用技能:打包压缩、热键、Shell与权限管理
|
3月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
313 3
|
6月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
270 60
|
3月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
5月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
568 0
|
7月前
|
Java Linux
自定义linux脚本用于快速jar包启动、停止、重启
自定义linux脚本用于快速jar包启动、停止、重启
325 29
|
7月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
182 17
|
7月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
200 4