首页
About Me
推荐
weibo
github
Search
1
linuxea:gitlab-ci之docker镜像质量品质报告
49,451 阅读
2
linuxea:如何复现查看docker run参数命令
23,044 阅读
3
Graylog收集文件日志实例
18,580 阅读
4
linuxea:jenkins+pipeline+gitlab+ansible快速安装配置(1)
18,275 阅读
5
git+jenkins发布和回滚示例
18,181 阅读
ops
Openvpn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack/logs
Open-Falcon
Prometheus
victoriaMetrics
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
互联咨询
最后的净土
软件交付
持续集成
gitops
devops
登录
Search
标签搜索
kubernetes
docker
zabbix
Golang
mariadb
持续集成工具
白话容器
elk
linux基础
nginx
dockerfile
Gitlab-ci/cd
最后的净土
基础命令
gitops
jenkins
docker-compose
Istio
haproxy
saltstack
marksugar
累计撰写
690
篇文章
累计收到
139
条评论
首页
栏目
ops
Openvpn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack/logs
Open-Falcon
Prometheus
victoriaMetrics
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
互联咨询
最后的净土
软件交付
持续集成
gitops
devops
页面
About Me
推荐
weibo
github
搜索到
9
篇与
的结果
2018-12-31
linuxea:变量实值与文件变量替换
我知道这个主题已经过时了,但我有一个需求需要来做,当我收集了这些后发现非常有趣,我觉得可以将这些记录下来,这是非常棒的一件事。我们将环境变量中的变量实际值通过几种方式替换到文件中环境变量,假如我的环境变量如下:[root@linuxea ~]$ env version=1.9.9 WWWPATH=/data/wwwroot USER=www SERVER_NAME=meftp.linuxea.com NGINX_PORT=80我的test.conf文件中的环境变量如下:我需要实现的目的是:如果变量存在就替换,如果不存在就使用默认值USER ${USER:-nginx}; server_name ${SERVER_NAME:-linuxea.com}; listen ${NGINX_PORT:-88}; root ${WWWPATH:-/var/www/html}; access ${access:-/var/logs/www.log};第一种方式[root@linuxea ~]$ ( echo "cat <<EOF" ; cat test.conf ; echo EOF ) | sh USER www; server_name meftp.linuxea.com; listen 80; root /data/wwwroot; access /var/logs/www.log;如果是在shell脚本中,它看起来像:#!/bin/sh cat > FILE <<EOF USER ${USER:-nginx}; server_name ${SERVER_NAME:-linuxea.com}; listen ${NGINX_PORT:-88}; root ${WWWPATH:-/var/www/html}; access ${access:-/var/logs/www.log}; EOF或者这样[root@linuxea ~]$ eval "echo \"$(cat test.conf)\"" USER www; server_name meftp.linuxea.com; listen 80; root /data/wwwroot; access /var/logs/www.log;如果ENV的这些值在文件中,则可以这样[root@linuxea ~]$ cat .env version=1.9.9 WWWPATH=/data/wwwroot USER=www SERVER_NAME=meftp.linuxea.com NGINX_PORT=80如:[root@linuxea ~]$ (. .env && eval "echo \"$(cat test.conf)\"") USER www; server_name meftp.linuxea.com; listen 80; root /data/wwwroot; access /var/logs/www.log;或者直接进行替换[root@linuxea ~]$ envsubst < .env > test.conf [root@linuxea ~]$ cat test.conf version=1.9.9 WWWPATH=/data/wwwroot USER=www SERVER_NAME=meftp.linuxea.com NGINX_PORT=80第二种方式如果test.conf文件中仅仅只是变量,如:[root@linuxea ~]$ cat test.conf USER $USER; server_name $SERVER_NAME; listen $NGINX_PORT; root $WWWPATH; access $access;替换的方式则可以如下进行:全部替换1:变量为空,则会替换为空[root@linuxea ~]$ envsubst < test.conf USER www; server_name meftp.linuxea.com; listen 80; root /data/wwwroot; access ;[root@linuxea ~]$ perl -pe 's/\$(\{)?([a-zA-Z_]\w*)(?(1)\})/$ENV{$2}/g' < test.conf USER www; server_name meftp.linuxea.com; listen 80; root /data/wwwroot; access ;全部替换2:变量不存在,则不替换[root@linuxea ~]$ perl -pe 's/\$([_A-Z]+)/$ENV{$1}/g' < test.conf USER www; server_name meftp.linuxea.com; listen 80; root /data/wwwroot; access $access;部分替换倘若我只想替换指定的$NGINX_PORT,$SERVER_NAME的变量,而不是所有的,则可以将被替换的单引号引起来,如下:[root@linuxea ~]$ envsubst '$NGINX_PORT,$SERVER_NAME' < test.conf USER $USER; server_name meftp.linuxea.com; listen 80; root $WWWPATH; access $access;如果有多个可以换行,如:[root@linuxea ~]$ envsubst '$NGINX_PORT, $SERVER_NAME' < test.conf USER $USER; server_name meftp.linuxea.com; listen 80; root $WWWPATH; access $access;也可以使用反斜杠:[root@linuxea ~]$ envsubst \$NGINX_PORT,\$SERVER_NAME < test.conf USER $USER; server_name meftp.linuxea.com; listen 80; root $WWWPATH; access $access精确声明替换当在使用一些系统敏感的变量替换的时候就会出现问题, 由此我们可以使用envsubst SHELL_FORMAT参数限制要在输入中替换的变量字符串(避免输入中的字符串意外替换为常见的shell变量值 - 例如$ HOME)。此刻我.env文件中有HOME变量=linuxea.com,如下:[root@linuxea ~]$ cat .env version=1.9.9 WWWPATH=/data/wwwroot USER=www SERVER_NAME=meftp.linuxea.com NGINX_PORT=80 HOME=linuxea.com而系统中的$HOME[root@linuxea ~]$ echo $HOME /root使用envsubst SHELL_FORMAT[root@linuxea ~]$ envsubst "$HOME" < .env > test.conf [root@linuxea ~]$ cat test.conf version=1.9.9 WWWPATH=/data/wwwroot USER=www SERVER_NAME=meftp.linuxea.com NGINX_PORT=80 HOME=linuxea.com如果你有多个,可以envsubst "$HOME,$HOSTNAME" < .env > test.conf 延伸阅读:https://unix.stackexchange.com/questions/294835/replace-environment-variables-in-a-file-with-their-actual-values https://unix.stackexchange.com/questions/294378/replacing-only-specific-variables-with-envsubst https://www.gnu.org/software/gettext/manual/html_node/envsubst-Invocation.html https://www.gnu.org/software/gettext/manual/gettext.html#sh_002dformat https://stackoverflow.com/questions/14155596/how-to-substitute-shell-variables-in-complex-text-files
2018年12月31日
4,686 阅读
2 评论
0 点赞
2016-10-02
判断字符为字母
判断输入的字符为字母[root@LinuxEA awk]# cat linuxea.com #!/bin/sh read linuxea if [[ $linuxea =~ ^[a-zA-Z]+$ ]]; then echo "ok" else echo "error" fi [root@LinuxEA awk]# 执行如下:[root@LinuxEA awk]# bash linuxea.com 123 error [root@LinuxEA awk]# bash linuxea.com acB ok [root@LinuxEA awk]# bash linuxea.com 1A error [root@LinuxEA awk]# bash linuxea.com A1 error [root@LinuxEA awk]# bash linuxea.com aa ok
2016年10月02日
3,283 阅读
0 评论
1 点赞
2016-01-08
nginx日志切割脚本
[root@Rsync ~]# cat nginx_log.sh #!/bin/sh Dateformat=`date +%Y-%m-%d` ------->时间 Basedir="/var/log/nginx" ---->nginx目录 Nginxlogdir="$Basedir/wwwlog" ----->nginx日志目录 Logname="access_www" ------>nginx日志名称 [ -d $Nginxlogdir ] && cd $Nginxlogdir||exit 1 ---------->如果存在目录则切换进去 [ -f ${Logname}.log ]||exit 1 /bin/mv ${Logname}.log ${Dateformat}_${Logname}.log ----->修改名称 /etc/init.d/nginx reload >/dev/null 2>%1 ------>reload #$Basedir/sbin/nginx -s reload ------>编译指定目录reload即可查看[root@Rsync ~]# ls /var/log/nginx/wwwlog/ 2015-12-27_access_www.log 2015-12-28_access_www.log access_www.log [root@Rsync ~]# 00 00 * /bin/sh /data/nginx_log.sh 如果需要小时或者分钟切割则修改计划任务时间和脚本中时间格式即可!
2016年01月08日
3,526 阅读
0 评论
0 点赞
2015-12-27
expect解决登录交互问题
expect语言,解决交互式输入密码的问题1,安装expectyum install expect -y 2,编写expect脚本[root@NFS-server tmp]# cat sshexpect.exp #!/usr/bin/expect if { $argc != 2 } { send_user "usage: expect EXPECT.exp file host\n" exit } #define var set file [lindex $argv 0] set host [lindex $argv 1] set password "123.com" spawn ssh-copy-id -i $file "-p 22 root@$host" expect { "yes/no" {send "yes\r";exp_continue} "*password" {send "$password\r"} } expect eof [root@NFS-server tmp]# 3,编写shell调用[root@NFS-server tmp]# cat 1.sh #!/bin/sh . /etc/init.d/functions for ip in 53 54 55 do expect sshexpect.exp ~/.ssh/id_dsa.pub 10.0.0.$ip &>/dev/null if [ $? -eq 0 ];then action "$ip" /bin/true else action "$ip" /bin/false fi done [root@NFS-server tmp]# 4, 测试,给10.0.0.53/55发id_dsa.pub[root@NFS-server tmp]# expect sshfile.exp ~/.ssh/id_dsa.pub 10.0.0.54 spawn ssh-copy-id -i /root/.ssh/id_dsa.pub -p 22 root@10.0.0.54 The authenticity of host '10.0.0.54 (10.0.0.54)' can't be established. RSA key fingerprint is b8:e2:26:b5:fb:b4:42:31:11:f8:15:45:71:0b:68:61. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.0.0.54' (RSA) to the list of known hosts. root@10.0.0.54's password: Now try logging into the machine, with "ssh '-p 22 root@10.0.0.54'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. [root@NFS-server tmp]# ls 1.sh pulse-75mVmxEZuktI sshfile.exp VMwareDnD vmware-root [root@NFS-server tmp]# vim 1.sh [root@NFS-server tmp]# vim 1.sh [root@NFS-server tmp]# mv sshfile.exp sshexpect.exp [root@NFS-server tmp]# bash 1.sh 53 [ OK ] 54 [ OK ] 55 [ OK ] 5,登录测试[root@NFS-server tmp]# ssh 10.0.0.53 Last login: Sat Dec 26 09:17:40 2015 from 10.0.0.250 [root@NFS-WEB1 ~]# exit logout Connection to 10.0.0.53 closed. [root@NFS-server tmp]# ssh 10.0.0.54 Last login: Sat Dec 26 02:10:43 2015 from 10.0.0.52 [root@NFS-WEB2 ~]# exit logout Connection to 10.0.0.54 closed. [root@NFS-server tmp]# ssh 10.0.0.55 Last login: Sat Dec 26 02:12:57 2015 from 10.0.0.250 [root@NFS-BACKUP ~]# exit logout Connection to 10.0.0.55 closed. [root@NFS-server tmp]#
2015年12月27日
3,687 阅读
0 评论
0 点赞
2015-12-04
shell实现跳板机
shell跳板机(触发信号后屏蔽信号)1,ssh key验证2,实现传统的远程连接菜单选择脚本3,利用linux信号防止用户在跳板机上操作4,用户登录后即调用脚本试验拓扑:3台机器node10------------node11--------------node1210.0.0.10---------10.0.0.11-----------10.0.0.12准备1,在node11和node12上创建用户2,生成秘钥3,将node1key传递到node12上4,创建脚本#!/bin/bash function trapper(){ trap '' INT QUIT TSTP TERM HUP } function menu(){ cat <<-EOF echo "=========Host List================" echo -e "\t1)10.0.0.12 " echo -e "\t2)10.0.0.10 " echo -e "\t6)exit " echo "==================================" EOF } function host(){ case "$1" in 1) ssh -p22 $user@10.0.0.12 ;; 2) ssh $user@10.0.0.10 ;; 3) ssh $user@ ;; 6|*) exit esac } function main(){ while true do trapper clear menu read -p "Please select:" num host $num done } main 5,调用脚本6,跳板机加固1,使用vpn链接至跳板机2,禁止跳板机从外网IP登录,只能从内网IP登录,禁止root用户登录,只允许跳板机账户登录listenAddress IP也可以写iptables规则只允许内网的IP段通过ssh登录3,其他服务器如果有外网IP也需要禁止,并且禁止root的密码登录,只允许key修改/etc/ssh/sshd_configpasswordAuthentication yes 改为PasswordAuthentication no
2015年12月04日
4,835 阅读
0 评论
0 点赞
2015-05-20
bash脚本编程之—函数
bash脚本编程之函数 函数:关键字 function f_name { 函数体 } f_name() { 函数体 } 函数是做什么的,为什么要使用!!! (1) 模块化编程;实现代码重用 (2) 代码结构更清晰,仍然是模块化编程的一个表现而已 变量类型:本地,环境,局部,特殊,位置这些变量! 一,局部变量 局部变量:函数生命周期,函数上下文 local V_NAME=VALUE 比如说:local描述,在其他全局中只要使用local,函数是不会发生变化的 #!/bin/bash # declare -i sum=0 sum() { local sum=0 sum=$[$1+$2] echo $sum } sum 5 6 echo $sum 了解函数递归: 函数直接或间接调用函数本身; 斐波那契数列: 1 1 2 3 5 8 13 从1开始,前两个数各是1,从第三个数开始,每一个数都是前两个数之和,这便是斐波那契数列。 阶乘:n!=n*(n-1)!=n*(n-1)*(n-2)! #!/bin/bash # fact() { if [ $1 -eq 0 -o $1 -eq 1 ]; then echo 1 else echo $[$1*$(fact $[$1-1])] fi } fact 4 数组:变量整列,通过同一个名字进行存取操作 第一个关键词:连续的多个独立的内存空间(元素),每个内存空间相当于一个变量; 数组元素:数组名[索引] 索引:从0开始编号 二:声明数组: declare -a Array_Name bash的属组支持稀疏格式 如何完成元素数组赋值: 方法1,一次赋值一个元素 a_name[index]-value 比如: weekday[0]-"Sunday" weekday[1]-"Monday" 方法2,一次赋值全部元素 weekday=(“Sunday”,"Monday","Tuserady") [root@www ~]# weekday=("SUN" "TUE" "MED") [root@www ~]# echo ${weekday[1]} TUE [root@www ~]# echo ${weekday[0]} SUN [root@www ~]# echo ${weekday[2]} MED [root@www ~]# 方法3,指定索引进行赋值 weekdays-([0]-"Sunday" [3]-"Thu" [6]-"Sat") [root@www ~]# echo ${weekdays[0]} Sunday [root@www ~]# weekdays=([6]="Sat" [4]="Fri" [1]="Mon") [root@www ~]# echo ${weekdays[1]} Mon [root@www ~]# echo ${weekdays[4]} Fri [root@www ~]# echo ${weekdays[6]} Sat [root@www ~]# 方法4, -a 切割后保存在多个元素中 引用数组元素:${array_name[index]} [root@www ~]# read -a mark a b c [root@www ~]# echo ${mark[1]} b [root@www ~]# echo ${mark[2]} c [root@www ~]# echo ${mark[0]} a [root@www ~]# 获取数组长度:${#array[*]},${#array[@]} 既数组中元素的个数; 元素个数 [root@www ~]# echo ${#mark[*]} 3 [root@www ~]# 示例一: 生成是个随机数,保存至数据中,而后显示属组索引为偶数的元素的值 [root@www ~]# echo $RANDOM:生成随机数 [root@www ~]# vim linuxEA.sh #!/bin/bash # for ((i=0;i<10;i++));do rand[$i]=$RANDOM echo ${rand[$i]} #随机数 done echo "=========================" for i in `seq 0 2 9`;do echo ${rand[$i]} done 示例二:定义一个属组,数据元素为/var/log目录下所有以.log结尾的文件的名字;显示每个文件的行数 [root@www ~]#vim Linux.sh #!/bin/bash # declare -a files files=(/var/log/*.log) #取长度 for i in `seq 0 $[${#files[*]}-1]`;do #行数 wc -l ${files[$i]} done [root@www ~]# bash linuxea.sh 81 /var/log/anaconda.ifcfg.log 255 /var/log/anaconda.log 396 /var/log/anaconda.program.log 1341 /var/log/anaconda.storage.log 811 /var/log/anaconda.yum.log 53 /var/log/boot.log 1807 /var/log/dracut.log 59 /var/log/mysqld.log 2 /var/log/pm-powersave.log 0 /var/log/spice-vdagent.log 0 /var/log/wpa_supplicant.log 693 /var/log/Xorg.0.log 97 /var/log/yum.log [root@www ~]# 三:数组切片 数组切片:从数组中挑选出指定的某个或某些元素 ${array[@]:offset:number} 1,offset:偏移的元素的个数; number:要取出的元素的个数 [root@www ~]# weekdays=("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat") 取周二和周三,@偏移两个取两个 [root@www ~]# echo ${weekdays[@]:2:2} Tue Wed [root@www ~]# 偏移两个取剩下所有 [root@www ~]# echo ${weekdays[@]:2} Tue Wed Thu Fri Sat [root@www ~]# 2,${array[@]:offset:} 取出偏移量之后剩余的所有的元素 ${array[@]}取所有 [root@www ~]# echo ${weekdays[@]} Sun Mon Tue Wed Thu Fri Sat [root@www ~]# 3,从数组中追加元素: 稀疏格式追加+1是不可以的 [root@www ~]# hello=([0]"abc" [1]="mn" [6]="hi") [root@www ~]# echo ${#hello[*]} 3 [root@www ~]# [root@www ~]# hello=([0]"abc" [1]="mn" [2]="hi") [root@www ~]# hello[${#hello[*]}]="MARK" [root@www ~]# echo ${hello[@]} [0]abc mn hi MARK [root@www ~]# hello[${#hello[*]}]="HOW ARE YOU" [root@www ~]# echo ${hello[@]} [0]abc mn hi MARK HOW ARE YOU [root@www ~]# hello[${#hello[*]}]="is LinuxEA.com " [root@www ~]# echo ${hello[@]} [0]abc mn hi MARK HOW ARE YOU,is LinuxEA.com 4,从数组中删除元素: 不需要加$ unset array[index] 切除hello的第0个元素 [root@www ~]# unset hello[0] [root@www ~]# echo ${hello[*]} mn hi MARK HOW ARE YOU,is LinuxEA.com [root@www ~]# 5,bash从4.0版本之后开始支持关联数组: 数组索引可为自定义的任何字符串, 定义方法:declare -A array_Name [root@www ~]# declare -A wdays [root@www ~]# wdays=([sun]="Sunday" [mon]="Monday" [tue]="Tuesday") [root@www ~]# echo ${wdays[sun]} Sunday [root@www ~]# 四:bash的字符串处理机制: bash的字符串处理机制: 1, 字符串切片:${var:offset:lenth} [root@www ~]# mypath="/etc/sysconfig/network-scripts/" 取基名,先取5个 [root@www ~]# echo ${mypath:5} sysconfig/network-scripts/ 再取15个 [root@www ~]# echo ${mypath:15} network-scripts/ 15个之后再取 [root@www ~]# echo ${mypath:15:5} netwo [root@www ~]# 2, 取出字符的最后几个字符:${var: -length} [root@www ~]# mypath="/etc/sysconfig/network-scripts" 取最后一个/线 [root@www ~]# echo ${mypath##*/} network-scripts [root@www ~]# 3, 基于模式取字串: ${var*word}:自左而右,查找var变量中存储的字符串中第一次出现的有word所指明的字符,删除此字符及其左侧的所有内容 ${var##*word}:自左而右,查找var变量中存储的字符串中最后一次出现的有word所指明的字符,删除此字符及其左侧的所有内容 ${var%word*} :自右而左,查找var变量中存储的字符串中第一次出现的有word所指明的字符,删除此字符及其右侧的所有内容 ${var%%word*}:自右而左,查找var变量中存储的字符串中最后一次出现的有word所指明的字符,删除此字符及其右侧的所有内容 4, 如果scripts后面有/线,在自左而右找第一次/出现的位置,所有就删空了 [root@www ~]# mypath="/etc/sysconfig/network-scripts/" [root@www ~]# echo ${mypath##*/} [root@www ~] 如果换成C,就从/etc/sysconfig/network-s开始 [root@www ~]# echo ${mypath##*c} ripts/ 如果换成一个#号,那就是第一次出现C的时候 [root@www ~]# echo ${mypath#*c} /sysconfig/network-scripts/ [root@www ~]# %号是反过来的 自右而左找第一次c出现的位置,并删除字符右侧的所有内容 [root@www ~]# echo ${mypath%c*} /etc/sysconfig/network-s [root@www ~]# 自右而左找最后一次c出现的位置 [root@www ~]# echo ${mypath%%c*} /et [root@www ~]# 5, 取指定路径的目录名: 自右而左查找第一次出现/,删除/右侧的内容 [root@www ~]# mypath="/etc/sysconfig/network-scripts" [root@www ~]# echo ${mypath%/*} /etc/sysconfig [root@www ~]# 示例: [root@www ~]# url="httpd://www.linuxea.com:80" 取端口 [root@www ~]# echo ${url##*:} 80 [root@www ~]# 取协议: [root@www ~]# echo ${url%%:*} httpd [root@www ~]# 五:查找替换: 查找替换: ${var/pattern/replacement}:查找var变量存储的字符中第一次由pattern匹配到的内容,并替换为replacement; ${var//pattern/replacement}:查找var变量存储的字符中所有能够由pattern匹配到的内容,并替换为replacement; ${var/#pattern/replacement}:查找var变量存储的字符中最开始处能够由pattern匹配到的内容,并替换为replacement; ${var/%pattern/replacement}:查找var变量存储的字符中最后位置能够由pattern匹配到的内容,并替换为replacement; 1, [root@www ~]# echo ${url/com/org} httpd://www.linuxea.org:80 [root@www ~]# 2, 替换所有替换:${var//pattern/replacement} [root@www ~]# echo ${url//w/W} httpd://WWW.linuxea.com:80 [root@www ~]# 3, [root@www ~]# userinfo="root:x:0:0:root user:/root:/bin/bash/root" [root@www ~]# echo ${userinfo/root/ROOT} ROOT:x:0:0:root user:/root:/bin/bash [root@www ~]# echo ${userinfo/#root/ROOT} ROOT:x:0:0:root user:/root:/bin/bash [root@www ~]# echo ${userinfo/%root/ROOT} root:x:0:0:root user:/root:/bin/bash [root@www ~]# echo ${userinfo/%root/ROOT} root:x:0:0:root user:/root:/bin/bash/ROOT [root@www ~]# echo ${userinfo//root/ROOT} ROOT:x:0:0:ROOT user:/ROOT:/bin/bash/ROOT [root@www ~]# 六:查找删除: 查找删除 ${var/pattern}:查找var变量存储的字符中第一次由pattern匹配到的内容,并删除; ${var//pattern}:查找var变量存储的字符中所有能够由pattern匹配到的内容,并删除; ${var/#pattern}:查找var变量存储的字符中最开始处能够由pattern匹配到的内容,并删除; ${var/%pattern}:查找var变量存储的字符中最后位置能够由pattern匹配到的内容,并删除; 1,删除第一此出现的root [root@www ~]# echo ${userinfo/root} :x:0:0:root user:/root:/bin/bash/root 2,删除整个行的root [root@www ~]# echo ${userinfo//root} :x:0:0: user:/:/bin/bash/ [root@www ~]# 3,删除行首root [root@www ~]# echo ${userinfo/#root} :x:0:0:root user:/root:/bin/bash/root 4,删除行尾root [root@www ~]# echo ${userinfo/%root} root:x:0:0:root user:/root:/bin/bash/ [root@www ~]# 七:字符串大小写转换: 字符串大小写转换 1, ${var^^}:把var变量中的所有小写字母,统统替换为大写; [root@www ~]# echo ${userinfo^^} ROOT:X:0:0:ROOT USER:/ROOT:/BIN/BASH/ROOT [root@www ~]# 2, ${var,,}:把var变量中的所有大写字母,统统替换为小写; [root@www ~]# myinfo=${userinfo^^} [root@www ~]# echo $myinfo ROOT:X:0:0:ROOT USER:/ROOT:/BIN/BASH/ROOT [root@www ~]# echo ${myinfo,,} root:x:0:0:root user:/root:/bin/bash/root [root@www ~]# 八:变量赋值: 变量赋值 1,${var:-word}:如果变量var为空或未声明,则返回word所表示的字符串;否则,则返回var变量的值; 2,${var:=word}:如果变量var为空或未声明,则返回word所表示的字符串,并且把word赋值为var变量;否则,则返回var变量的值; 3,${var:?error}:如果变量var为空或未声明,则返回error为错误信息;否则,则返回var变量的值; 4,${var:+word}:如果变量var为空或未声明,忽略;否则,则返回word; [root@www ~]# echo $name [root@www ~]# echo ${name:-tom} tom [root@www ~]# name=mark [root@www ~]# echo ${name:-tom} mark [root@www ~]# 撤销掉name 。 1,为了避免把原有值给替换掉 [root@www ~]# unset name [root@www ~]# name=${name:-tom}:如果name原来有值,它把自己值赋给自己,如果没有赋,则赋给name [root@www ~]# echo $name tom [root@www ~]# name=${name:-jerry} :name已经有值为tom [root@www ~]# echo $name:仍然显示tom,因为name在第一次时已经赋值 tom [root@www ~]# 2, [root@www ~]# unset name [root@www ~]# echo "User's is ${name:=tom}":等于。 User's is tom [root@www ~]# echo "User's name is ${name:=tom}" User's name is tom [root@www ~]# echo $name tom [root@www ~]# [root@www ~]# unset name [root@www ~]# echo "User's name is ${name:-tom}":-号是不会赋值的只会返回 User's name is tom [root@www ~]# echo $name [root@www ~]# [root@www ~]# unset name [root@www ~]# echo "User's name is ${name:?wrong}" -bash: name: wrong [root@www ~]# name=tom [root@www ~]# echo "User's name is ${name:?wrong}" User's name is tom [root@www ~]# 如果对应的变量没有值,我们要直接引用的话,命令是不会正常运行的。 [root@www ~]# unset name [root@www ~]# echo "User's name is ${name:?wrong}" -bash: name: wrong [root@www ~]# echo $? 1 [root@www ~]# 但是在有些场景下它还是有用的
2015年05月20日
4,232 阅读
0 评论
0 点赞
2015-05-20
文本处理三贱客之—sed
三贱客之sed 1,grep:文本搜索工具 grep家族有三款工具:egrep,fgrep sed:全程stream editor,sed是流编辑器 sed和其他一样,只是把文本提取到内存中来进行编辑 awk(gawk):文本格式化工具,也可以称作文本报告生成器 以上三者在功能有重叠的地方,但是他们还是有各自的特色 sed命令: 在sed命令介绍之前,先看看正则表达式元字符: 字符匹配:., 任意单个字符,[]指定范围内单个字符,[^]指定范围外单个字符 次数指定:*前面字符任意次,\?零次或多次,\+一 次或多次 ,\{m,n}匹配指定次数,\{n\}精确匹配n此 位置锚定:^行首,$行尾,\<单词首部,\>单词尾部 分组和引用:\()分组,\1,\2,...引用 或者,多选一:a|b|c 再来扯一扯vim编辑器中的查找替换用法: s:用法格式,首先要地址定界s/查找范围,要查找的内容/替换为的内容 要查找的内容:可使用正则表达式 替换为的内容:不支持正则表达式,但支持使用引用前面正则表达式分组中的内容 地址定界:%全文查找,startline,endline,起始结束 也可以这样写/pat1/,/pat2/ 先看下sed语法格式 sed [OPTION]... {script-only-if-no-other-script} [input-file].. 选项 -r:支持扩展正则表达式元字符,不加-r就是基本表达式 -n:静默模式 -e:script -e script2 -e 。。。:指定多脚本运行 -f:/path/to/script_file:从指定文件中读取脚本并运行 -i:直接编辑源文件 地址定界: #: 指定行; $: 最后一行; /regexp/:任何能够被regexp所匹配到的行; \%regexp%:同上,只不过换作%为regexp边界符; /regexp/| : \%regexp%| :匹配时忽略字符大小写; startline,endline: #,/regexp/:从#行开始,到第一次被/regexp/所匹配到的行结束,中间的所有行; #,# /regexp1/,/regexp2/:从第一次被/regexp1/匹配到的行开始,到第一次被/regexp2/匹配到的行结束,中间的所有行; #,+n:从#行开始,一直到向下的n行; first~step:指定起始行,以及步长; sed概念: 当启动sed命令后,它会在内容中找一段空间,这段空间是处理sed“输入输出”的的空间,我们可以称他为“工作空间”,它会从源文件中逐行读取到sed的工作空间,(如果没有定界)读取一行内容,而后将结果打印至屏幕,而这个时候sed的这段内存空间叫做sed模式空间 sed基本工作机制: 每次读取一行文件至“模式空间(pattern space)”中,在模式空间中完成处理,不修改源文件,将处理结果输出至标准输出设备 sed编辑命令: d:删除模式空间中的行 示例:删除/etc/fstab第一行和第二行 [root@node1 clean-simple-white]# sed '1,2d' /etc/fstab # /etc/fstab # Created by anaconda on Sat Apr 4 08:45:23 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=4fb479dc-0364-41ac-a12d-841210d879a4 / ext4 defaults 1 1 UUID=30d2724b-a9be-4e32-8b9a-cf731a92173a /boot ext4 defaults 1 2 UUID=7568de25-a229-43cb-952a-ca5fd83bbdcc swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 如果加上-n 那就静默模式你是看不到结果的,并且cat也是看不到结果的 sed -n '1,2d' /etc/fstab -i -i如果和-n是不能一起使用的 复制一个fstab [root@node1 clean-simple-white]# cp /etc/fstab /tmp/ 修改源文件 [root@node1 clean-simple-white]# sed -i '1,3d' /tmp/fstab 在查看 [root@node1 clean-simple-white]# cat /tmp/fstab # Created by anaconda on Sat Apr 4 08:45:23 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) 地址定界: #:指定行 $:最后一行‘ /regexp/:任何能够被regexp所匹配到的行 \%regexp%:同上,只不过换做%为regexp边界符; /regexp/|:匹配时忽略字符大小写:\ startlone,endline: #,/regexp/:这表示从#行开始,到第一次被/regexp/所匹配到的行结束,中间的所有行 #,#:某行开始某行结束 /regexp1/,/regexp2/:从第一次被/regexp1/匹配到的行开始,到第一次被/regexp2/匹配到的行结束, #,+n:从#行开始,一直到向下的n行: first~step:指定起始行,以及步长: # 示例: 删除所有以#开头的行 [root@node1 clean-simple-white]# sed '/#/d' /tmp/fstab UUID=4fb479dc-0364-41ac-a12d-841210d879a4 / ext4 defaults 1 1 UUID=30d2724b-a9be-4e32-8b9a-cf731a92173a /boot ext4 defaults 1 2 UUID=7568de25-a229-43cb-952a-ca5fd83bbdcc swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 [root@node1 clean-simple-white]# =:打印行号 [root@node1 clean-simple-white]# sed '=' /tmp/fstab 1 # Created by anaconda on Sat Apr 4 08:45:23 2015 2 # 3 # Accessible filesystems, by reference, are maintained under '/dev/disk' 4 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 5 # 6 UUID=4fb479dc-0364-41ac-a12d-841210d879a4 / ext4 defaults 1 1 7 UUID=30d2724b-a9be-4e32-8b9a-cf731a92173a /boot ext4 default '/^#/=' 只打印#开头的行 [root@node1 clean-simple-white]# sed '=' /tmp/fstab 1 # Created by anaconda on Sat Apr 4 08:45:23 2015 2 # 3 # Accessible filesystems, by reference, are maintained under '/dev/disk' 4 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 5 # 6 UUID=4fb479dc-0364-41ac-a12d-841210d879a4 / ext4 defaults 1 1 7 UUID=30d2724b-a9be-4e32-8b9a-cf731a92173a /boot ext4 default a:在第三行添加\new mark 1, sed '1a \new mark' /tmp/fstab [root@localhost rsyslog-mysql-5.8.10]# sed '3a \new mark' /tmp/fstab # # /etc/fstab new mark # Created by anaconda on Mon Apr 13 14:19:18 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/vg0-root / ext4 defaults 1 1 UUID=90679dfa-480a-47fd-be39-e243d7a73a78 /boot ext4 defaul 2, 只要是#前都加\new mark [root@localhost rsyslog-mysql-5.8.10]# sed '/^#/a \new mark' /tmp/fstab # new mark # /etc/fstab new mark # Created by anaconda on Mon Apr 13 14:19:18 2015 new mark # new mark # Accessible filesystems, by reference, are maintained under '/dev/disk' new mark # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info new mark # new mark /dev/mapper/vg0-root / ext4 defaults 1 1 UUID=90679dfa-480a-47fd-be39-e243d7a73a78 /boot ext4 defaults n:追加 在指定行附加多行:\new mark\nsedond line\nthird [root@localhost rsyslog-mysql-5.8.10]# sed '1a \new mark\nsedond line\nthird line' /tmp/fstab new mark sedond line third line # # /etc/fstab # Created by anaconda on Mon Apr 13 14:19:18 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/vg0-root / ext4 defaults 1 1 UUID=90679dfa-480a-47fd-be39-e243d7a73a78 /boot ext4 defaults 1 2 i:插入 同上 -n于p 1,示例:将5和7行打印一份 sed '5,7p' /tmp/fstab [root@localhost rsyslog-mysql-5.8.10]# sed '5,7p' /tmp/fstab # # /etc/fstab # Created by anaconda on Mon Apr 13 14:19:18 2015 # # # Accessible filesystems, by reference, are maintained under '/dev/disk' # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 2,示例-n :将5和7行打印一份,其他静默 [root@localhost rsyslog-mysql-5.8.10]# sed -n '5,7p' /tmp/fstab # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info [root@localhost rsyslog-mysql-5.8.10]# c:替换指定的行 用指定文本替换 sed -n '5,7c' \new test' \tmp\fstab 示例: (1) 删除/boot/grub/grub.conf文件中所有行的行首的空白字符; sed 's/^[[:space:]]\+//' /boot/grub/grub.conf (2) 删除/etc/fstab文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符; sed 's/^#[[:space:]]\+//' /etc/fstab (3) 把/etc/fstab文件的奇数行另存为/tmp/fstab.3; sed '1~2w /tmp/fstab.3' /etc/fstab (4) echo一个文件路径给sed命令,取出其基名;进一步地,取出其路径名; 取基名:echo "/etc/sysconfig/network-scripts/" | sed 's@^.*/\([^/]\+\)/\?$@\1@' 取路径名:echo "/etc/sysconfig/network-scripts/" | sed 's@[^/]\+/\?$@@' sed命令另一个称作"hold space"的内存空间: 这种模式一般不会被使用 高级命令: h:用模式空间中的内容覆盖保持空间的内容; H:把模式空间中的内容追加至保持空间中内容的后面; g:从保持空间中取到其内容,并将其覆盖模式空间中的内容; G:从保持空间中取到其内容,并将其追加在模式空间中的内容的后面; x:把保持空间和模式空间中的进行交换; n:读取匹配到的行的下一行至模式空间;(会覆盖模式空间中的原有内容); N:读取匹配到的行的下一行至模式空间,追加在模式空间中原有内容的后面; d:删除模式空间中的内容; D:删除多行模式空间中的首行; 注意:命令功能可使用!取反;分号可用于分隔脚本 示例: sed 'G' /etc/issue: 在文件中的每行后方添加空白行; [root@www ~]# sed 'G' /etc/issue CentOS release 6.6 (Final) Kernel \r on an \m LinuxEA Education Learning Services http://www.linuxea.com [root@www ~]# cat /etc/issue CentOS release 6.6 (Final) Kernel \r on an \m LinuxEA Education Learning Services http://www.linuxea.com [root@www ~]# sed '$!d' /etc/fstab:保留最后一行; [root@www ~]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Mon Apr 13 14:19:18 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/vg0-root / ext4 defaults 1 1 UUID=90679dfa-480a-47fd-be39-e243d7a73a78 /boot ext4 defaults 1 2 /dev/mapper/vg0-usr /usr ext4 defaults 1 2 /dev/mapper/vg0-var /var ext4 defaults 1 2 /dev/mapper/vg0-swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 172.16.249.249:/shared/nfs/ /mnt ext4 defaults 0 0 [root@www ~]# sed '/^$/d;G' /etc/issue: 保证指定的文件每一行后方有且只有一个空白行; [root@www ~]# sed '/^$/d;G' /etc/issue CentOS release 6.6 (Final) Kernel \r on an \m LinuxEA Education Learning Services http://www.linuxea.com [root@www ~]# tail /etc/issue CentOS release 6.6 (Final) Kernel \r on an \m LinuxEA Education Learning Services http://www.linuxea.com [root@www ~]# sed 'n;d' /etc/issue:保留奇数行; [root@www ~]# sed 'n;d' /etc/issue CentOS release 6.6 (Final) http://www.linuxea.com [root@www ~]# [root@www ~]# tail /etc/issue CentOS release 6.6 (Final) Kernel \r on an \m LinuxEA Education Learning Services http://www.linuxea.com sed -n '1!G;h;$p' /etc/issue;反转整个文件 [root@www ~]# sed -n '1!G;h;$p' /etc/issue http://www.linuxea.com LinuxEA Education Learning Services Kernel \r on an \m CentOS release 6.6 (Final) sed '$!N;$!D' /etc/issue:显示最后两行 [root@www ~]# sed '$!N;$!D' /etc/issue http://www.linuxea.com [root@www ~]# 也可以直接:tail -2 [root@www ~]# tail -2 /etc/issue http://www.linuxea.com [root@www ~]# 哈哈,这篇文字不要太水啊。
2015年05月20日
4,594 阅读
2 评论
0 点赞
1
2