首页
Search
1
安装docker时报错container-selinux >= 2:2.74
124 阅读
2
rsync命令(可替代rm删除巨量文件)
101 阅读
3
docker 镜像加速器配置,daemon.json文件详解
90 阅读
4
使用国内镜像地址拉取k8s安装需要的images
79 阅读
5
Redhat 8版本安装ansible步骤
75 阅读
运维
自动化运维
数据库
容器与k8s
环境
云计算
脚本
登录
Search
标签搜索
命令
nginx
Mingrui
累计撰写
64
篇文章
累计收到
0
条评论
首页
栏目
运维
自动化运维
数据库
容器与k8s
环境
云计算
脚本
页面
搜索到
19
篇与
的结果
2024-09-26
awk详解—变量与关联数组(部分)
在awk中,各种字段是用美元符号和字段编号来引用的($1,$2,$3等)。awk中还有内建变量。如NF,其中保存着当前行中的字段总数,而$NF指向的是最后一个字段,加入ls的输出行共有8个字段,那么NF的值是8,$NF的值是改行中的第8个字段(等同于$8)。此外,读取awk变量时不需要使用$符合。比如NF本身就是一个有效的变量引用。在其之前加上$就将其含义从“当前行的字段总数”改成了“当前行的最后一个字段”。又比如在awk的for循环中,假设循环变量为i,那么像引用变量i的值,直接写作i即可。那么$i代表什么呢?变量i的值被解析成一个数字,然后“美元符号-数字”的表达式会被理解为引用某个输入字段或单词,即第i个字段。{callout color="#f0ad4e"}一些示例{/callout}逆序输出输入行的单词[root@web1 ~]# tail -5 /etc/passwd | awk -F: '{ for (i=NF; i>0; i--){ printf "%s ", $i; } printf "\n" }' /bin/false /var/lib/mysql MySQL Server 27 27 x mysql /sbin/nologin /usr/share/httpd Apache 48 48 x apache /sbin/nologin /var/lib/rpcbind Rpcbind Daemon 32 32 x rpc /sbin/nologin /var/lib/nfs RPC Service User 29 29 x rpcuser /sbin/nologin /var/lib/nfs Anonymous NFS User 65534 65534 x nfsnobody #当for循环中的条件改为i>=0时,会输出原始的行。因为$0代表本行所有的列。 [root@web1 ~]# tail -5 /etc/passwd | awk -F: '{ for (i=NF; i>=0; i--){ printf "%s ", $i; } printf "\n" }' /bin/false /var/lib/mysql MySQL Server 27 27 x mysql mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false /sbin/nologin /usr/share/httpd Apache 48 48 x apache apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin /sbin/nologin /var/lib/rpcbind Rpcbind Daemon 32 32 x rpc rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin /sbin/nologin /var/lib/nfs RPC Service User 29 29 x rpcuser rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin /sbin/nologin /var/lib/nfs Anonymous NFS User 65534 65534 x nfsnobody nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin汇总数字列表#汇总文件夹下所有文件的总大小。 [root@web1 ~]# ls -l | awk '{sum+=$5}END{print sum}' 2959663563统计字符串出现的次数使用到的工具是awk的关联数组(其他语言中的散列或字典)。本例中统计的是网站的访问量,显示的结果是IP地址及其访问次数。关于下面这行代码ip[$1]++这里将IP地址($1的值)被用作数组索引。该数组的实际元素为ip[118.113.18.252]、[111.229.150.53]等。之所以称该数组为关联数组,是因为使用散列表将每个独一的字符串与数值关联了起来。这些事情awk已经自动做好,不需要在手动进行字符串的比较或查找。建立好数组之后,为了获取数组中每个元素的值,awk提供了一种特殊形式的for循环,与数字形式的for(i=0;i<=10;i++){}不同,它有专用于关联数组的语法。for(i in ip){}在该语句中,变量i连续从数组ip的索引中获取值(没有特定顺序)。也就是说i会在每次循环中都得到一个值(如本例中的IP地址,111.229.150.53、111.229.150.53等这些值)。而ip[i]则会返回数组元素的值。关联数组是awk的一个强大特性。[root@web1 ~]# awk ' {ip[$1]++} END{for(i in ip){ print i "\t" ip[i] } }' access.log|sort -nr -k2 | head -5 118.113.18.252 13345 111.229.150.53 3803 180.163.28.109 3553 180.163.28.143 3435 180.163.30.76 3322
2024年09月26日
50 阅读
0 评论
0 点赞
2024-09-26
grep命令详解
{alert type="info"}grep命令可以搜索文件,查找指定的字符串{/alert}grep的第一个参数(待搜索的内容)可以是一个简单的字符串,也可以是更复杂的正则表达式。命令行选项[root@web1]# grep panel * 1panel.service:Description=1Panel, a modern open source linux panel 1panel.service:ExecStart=/usr/bin/1panel 1pctl: systemctl status 1panel.service 1pctl: systemctl start 1panel.service 1pctl: systemctl stop 1panel.service -h:不显示特定文件名[root@web1]# grep -h panel * Description=1Panel, a modern open source linux panel ExecStart=/usr/bin/1panel systemctl status 1panel.service systemctl start 1panel.service systemctl stop 1panel.service-c:只显示匹配到了几次,不显示文件中包含指定字符串的行[root@web1]# grep -c panel * 1panel:526 1panel.service:2 1pctl:23 install.log:3 install.sh:11 LICENSE:0 README.md:6-l:只显示包含搜索结果的文件名如果在一个文件中找到了多次匹配,grep仍然只输出该文件名一次。如果没有找到匹配,则什么都不输出。[root@web1]# grep -l panel * 1panel 1panel.service 1pctl install.log install.sh README.md-q:只显示搜索是否成功-q选项没有任何输出,需要使用$?来查看该命令是否成功。如果搜索成功,返回0;如果搜索不到结果,返回1。根据-q选项的该特点,该选项参数更长用于if、while等条件判断中。[root@web1]# grep -q panel * [root@web1]# echo $? 0[root@web1]# if grep -q panel 1panel ;then echo yes;else echo no;fi yes #另一种写法 [root@web1 1panel-v1.10.1-lts-linux-amd64]# if grep panel 1panel > /dev/null ;then echo yes;else echo no;fi yes #如果不重定向到/dev/null,会输出grep的执行结果,界面显得凌乱。 [root@web1 1panel-v1.10.1-lts-linux-amd64]# if grep panel * ;then echo yes;else echo no;fi README.md:- 环境地址:<https://demo.1panel.cn/> README.md:- 密码:1panel README.md:curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh README.md:- [在线文档](https://1panel.cn/docs/) yes-i:不区分大小写[root@web1]# grep -i Panel * 1panel.service:Description=1Panel, a modern open source linux panel 1panel.service:ExecStart=/usr/bin/1panel 1pctl: echo "1Panel 控制脚本" 1pctl: echo " status 查看 1Panel 服务运行状态" 1pctl: echo " start 启动 1Panel 服务" 1pctl: echo " stop 停止 1Panel 服务"-v:对搜索结果取反搜索更复杂的模式grep中的正则表达式提供了更为强大的模式匹配功能,能够满足大部分需求。正则表达式描述了待匹配字符串的模式。字母字符(或者对于shell没有特殊含义的其他字符),只匹配自身。如“A”匹配A,“B”匹配B,“ab”匹配ab。特殊字符:既可以单独使用,也可以与其他字符结合。. 点号,匹配任意单个字符。星号,匹配上一个字符0次或多次。^ 尖角号,匹配文本行的行首位置。$ 美元符号,匹配文本行的行尾位置。[] 匹配其中任意一个字符。[^] 方括号中以尖角号开头,则匹配的是不在该字符组中的任意字符。{n,m} 区间表达式,一种重复机制。匹配前面的内容n到m次。{n} 只重复n次。{n,} 至少重复n次。 📜 举例:.... 可以匹配任意4个字符.A 匹配第二个字母是A的任意字符.A. 匹配任意单个字符,然后是A,然后是任意单个字符A* 匹配A出现了0次或多次.* 匹配任意单个或多个字符(不包含空行)^$ 匹配空行A{5} 匹配连续的5个A字母A{5,} 至少匹配连续的5个A
2024年09月26日
56 阅读
0 评论
0 点赞
2024-03-09
sed命令高级技巧
写入多条命令sed -i '/UseDNS/{ s/yes/no/ s/#// }' /etc/ssh/sshd_config #效果:将#UseDNS yes 该为:UseDNS no #注:此条命令是关闭ssh的DNS反查,可以加快ssh连接速度。 #或者使用-e参数 sed -ie ' /Use/s/#// s/yes/no/ ' /etc/ssh/sshd_config ls -l | awk '{print"\"" $9" " $10" "$(11)"\""}'| sed -e 's/NSD ADMIN // ' -e 's/[A-Z]/\l&/g'; 关于最后一条命令的解释:-e选项: 在单次运行中执行多个编辑命令。它的作用是 将后续的字符串参数视为独立的 sed 脚本命令,并按顺序依次应用这些命令到输入文本中。s/[A-Z]/1&/g:将所有的大写字母转换为小写删除第一个匹配到的行sed -i '0,/pattern/{/pattern/d;}' filename说明:0,/pattern/:表示从文件开始到第一个匹配 pattern 的行。/pattern/ 是匹配条件。{/pattern/d;}:{} 是一个命令块,对匹配到的行执行其中的命令。/pattern/d 表示删除匹配到的行。示例假设有如下文件test.txt line 1 pattern line 2 pattern line 3 只想删除第一个匹配到 pattern 的行,可以使用: sed '0,/pattern/{/pattern/d;}' test.txt 执行后,文件内容变为: line 1 line 2 pattern line 3
2024年03月09日
49 阅读
0 评论
0 点赞
2024-03-08
rsync命令(可替代rm删除巨量文件)
当一个文件夹下面有海量的文件需要删除时,使用rm命令往往可能会遇到问题。一个问题是删除速度慢,往往需要几分钟到几十分钟不等的时间才能完成操作;另一个问题是可能会有参数溢出的问题导致rm命令报错。此时,可以使用rsync命令来执行删除操作,主要用到的参数是--delete。比如,可以看到下面的例子中a文件夹下面有246803个文件。要删除这些文件,可以先建一个空文件夹b,然后用rsync命令让b文件夹与a文件夹进行同步。ls | wc -l 246803 #rm命令报错 rm -f * -bash: /usr/bin/rm: Argument list too long #使用rsync命令 rsync -av --delete /tset/b/ /tset/a/ #使用一个空的文件夹与a同步,使用--delete参数删除只存在于目标目录、不存在于源目录的文件。 sent 43 bytes received 3,676,572 bytes 294,129.20 bytes/sec total size is 0 speedup is 0.00 {lamp/}rsync :同步:增量拷贝,只传输变化过的数据命令参数详解rsync [选项...] 源目录 目标目录-n:测试同步过程,不做实际修改--delete:删除目标文件夹内多余的文档-a:归档模式,相当于-rlptgoD-v:显示详细操作信息-z:传输过程中启用压缩/解压--exclude 排除文件--include 用来指定必须同步的文件模式#同步时排除某些文件或目录 rsync -av --exclude='*.txt' source/ destination rsync -av --exclude '*.txt' source/ destination #上面命令排除了所有 TXT 文件。 #注意,rsync 会同步以“点”开头的隐藏文件,如果要排除隐藏文件,可以这样写--exclude=".*"。 #如果要排除某个目录里面的所有文件,但不希望排除目录本身,可以写成下面这样: rsync -av --exclude 'dir1/*' source/ destination #多个排除模式,可以用多个--exclude参数 rsync -av --exclude 'file1.txt' --exclude 'dir1/*' source/ destination rsync -av --exclude={'file1.txt','dir1/*'} source/ destination #如果排除模式很多,可以将它们写入一个文件,每个模式一行,然后用--exclude-from参数指定这个文件 rsync -av --exclude-from='exclude-file.txt' source/ destination关于/的注意事项不加/,源目录source会被完整的复制到目标目录destination下面,形成/destination/source 这样的目录结构源目录source后面有/,则只是将source目录里面的内容完整的同步到destination目录下,而不同步source目录本身。rsync -a source destination #destination目录下会有一个source文件夹 rsync -a source/ destination #destination目录下面会有source文件夹里面的内容,而没有source本身。其他rsync命令#模拟同步操作,显示将要发生的更改,但不实际执行。 rsync --dry-run source_dir destination_dir #限制带宽使用率,以 KB/s 为单位,在同步过程中限制带宽使用率为 500 KB/s rsync --bwlimit=500 source_dir destination_dir #允许在中断后重新传输,同时显示实时进度 rsync --progress --partial source_dir destination_dir #仅同步小于 100KB 的文件 rsync -a --max-size='100K' source_dir destination_dir #仅同步大于 1MB 的文件 rsync -a --min-size='1M' source_dir destination_dir #只同步文件夹,忽略文件 rsync -a --include='*/' --exclude='*' source_dir destination_dir #将同步过程信息记录到指定的日志文件中 rsync -avzP --log-file='log.txt' source_dir destination_dir #排除所有的 .txt 文件,并在目标目录中删除已排除的文件 rsync -a --exclude='*.txt' --delete-excluded source_dir destination_dir
2024年03月08日
101 阅读
0 评论
0 点赞
2024-03-04
shell脚本调试技巧
{card-default label=" 使用dos2unix处理外部脚本 " width=""}windows平台开发的代码其换行符和linux下的不一样,使用dos2unix工具格式化一下,可以解决该问题{/card-default}yum -y install dos2unix dos2unix xx.sh{card-default label=" 使用bash命令参数调试 " width=""}sh -nvx xx.sh{/card-default}-n: 不会执行该脚本,仅查询该脚本语法是否有问题,并给出错误提示。-v: 在执行脚本时,先将脚本的内容输出到屏幕上,然后执行脚本,如果有错误,给出错误提示。-x: 将执行的脚本内容及输出打印到屏幕上,常用的参数。# 在脚本的执行过程中输出行号,以便于跟踪。 #实现方法为设置环境变量。 [root@VM-4-6-centos ~]\# set | grep PS[1-5] PS1='[\u@\h \W]\$ ' PS2='> ' PS4='+ ' #PS4默认情况下表示加号。 [root@VM-4-6-centos ~]\# export PS4='+${LINENO}' #此命令即可实现在跟踪过程中显示行号,也可放在脚本中。{card-default label=" 使用set命令调试部分脚本内容 " width=""}通过set -x 命令开启调试功能,通过set +x 关闭调试功能{/card-default}set -n:读命令但不执行set -v:显示读取的所有行set -x:显示所有命令及其参数{callout color="#f0ad4e"}set 命令的最大优点是相比bash -x 可以缩小调试的作用域{/callout}cat xx.sh #!/bin/bash set -x for a in `seq 9` do for b in `seq 9` do [ $a -ge $b ] && echo -en "$a x $b = $(expr $a \* $b)" done set +x #说明:只调试a=1时程序运行过程,当a=2时结束调试过程。 echo " " done{card-default label=" 使用工具进行脚步调试 " width=""}bashdb或者shellcheck{/card-default}yum -y install ShellCheck
2024年03月04日
65 阅读
0 评论
0 点赞
1
2
3
4