Linux使用的提示符

wubx 发表了文章 • 0 个评论 • 636 次浏览 • 2016-12-27 11:09 • 来自相关话题

用于记录一下提示符:
添加到/etc/profile
zst_ps1()
{
    Date=$(date +%F)
    Time=$(date +%H:%M:%S)

    PS1="\\n\[\e[1;37m[\e[m\]\[\e[1;32m\u\e[m\]\[\e[1;33m@\e[m\]\[\e[1;35m\h $Time \e[m\]\e[1;36m\`pwd\`\e[m\e[1;37m]\e[m\n\\$"
}

PROMPT_COMMAND=zst_ps1执行: 
source /etc/profile
 
后补知识:
 
prompt 参数含义:
\d :#代表日期,格式为weekday month date,例如:"Mon Aug 1"
\H :#完整的主机名称
\h :#仅取主机的第一个名字
\t :#显示时间为24小时格式,如:HH:MM:SS
\T :#显示时间为12小时格式
\A :#显示时间为24小时格式:HH:MM
\u :#当前用户的账号名称
\v :#BASH的版本信息
\w :#完整的工作目录名称
\W :#利用basename取得工作目录名称,所以只会列出最后一个目录
\# :#下达的第几个命令
\$ :#提示字符,如果是root时,提示符为:# ,普通用户则为:$终端下色彩:
前景 背景
30 40 黑色
31 41 红色
32 42 绿色
33 43 黄色
34 44 蓝色
35 45 紫红色
36 46 青蓝色
37 47 白色效果控制
代码 意义
-------------------------
0 OFF
1 高亮显示
4 underline
5 闪烁
7 反白显示
8 不可见
定义色的开始及结束:
开始: \[\e\[N;Mm     # 其中N可以指效果或是背景色, M是前景色  
结束: \[\e[m             #终止特效
 
练习:
echo -e "\e[1;34m 蓝色字 fireflyclub.org \e[m"
echo -e "\e[1;35m 紫色字 fireflyclub.org \e[m"
echo -e "\e[1;36m 天蓝字 fireflyclub.org \e[m"
echo -e "\e[1;37m 白色字 fireflyclub.org \e[m"
玩的开心:) 去定制你自已喜欢的提示符吧。 查看全部
用于记录一下提示符:
添加到/etc/profile
zst_ps1()
{
    Date=$(date +%F)
    Time=$(date +%H:%M:%S)

    PS1="\\n\[\e[1;37m[\e[m\]\[\e[1;32m\u\e[m\]\[\e[1;33m@\e[m\]\[\e[1;35m\h $Time \e[m\]\e[1;36m\`pwd\`\e[m\e[1;37m]\e[m\n\\$"
}

PROMPT_COMMAND=zst_ps1
执行: 
source /etc/profile
 
后补知识:
 
prompt 参数含义:
\d :#代表日期,格式为weekday month date,例如:"Mon Aug 1"
\H :#完整的主机名称
\h :#仅取主机的第一个名字
\t :#显示时间为24小时格式,如:HH:MM:SS
\T :#显示时间为12小时格式
\A :#显示时间为24小时格式:HH:MM
\u :#当前用户的账号名称
\v :#BASH的版本信息
\w :#完整的工作目录名称
\W :#利用basename取得工作目录名称,所以只会列出最后一个目录
\# :#下达的第几个命令
\$ :#提示字符,如果是root时,提示符为:# ,普通用户则为:$
终端下色彩:
前景    背景
30 40 黑色
31 41 红色
32 42 绿色
33 43 黄色
34 44 蓝色
35 45 紫红色
36 46 青蓝色
37 47 白色
效果控制
代码              意义   
-------------------------
0 OFF
1 高亮显示
4 underline
5 闪烁
7 反白显示
8 不可见

定义色的开始及结束:
开始: \[\e\[N;Mm     # 其中N可以指效果或是背景色, M是前景色  
结束: \[\e[m             #终止特效
 
练习:
echo -e "\e[1;34m 蓝色字 fireflyclub.org  \e[m"
echo -e "\e[1;35m 紫色字 fireflyclub.org \e[m"
echo -e "\e[1;36m 天蓝字 fireflyclub.org \e[m"
echo -e "\e[1;37m 白色字 fireflyclub.org \e[m"

玩的开心:) 去定制你自已喜欢的提示符吧。

Linux后台运行命令的三种方法

glon 发表了文章 • 0 个评论 • 636 次浏览 • 2016-04-15 23:53 • 来自相关话题

后台运行命令有下面3中方法:

1、在命令后面加 &
    有可能会在关闭当前终端的时候中断退出
 
2、使用 nohup
    如:nohup sleep 100 &
    会在当前目录生成一个 nohup.out 文件,会收集这个命令在执行过程中产生的日志
    在 crt 这些工具的某些版本也会出现在关闭当前终端的时候中断退出(参考大师兄的分享),这时候可以把命令写到脚本中,然后后台执行脚本。
    使用 jobs 命令可以看到这些后台任务
 
3、使用 screen 工具
    1)安装:yum install -y screen
    2)使用:
    step1:打开 screen 窗口:
        直接打开: screen 
        在打开 screen 窗口的时候,可以给这个窗口命名:screen -S 窗口名
    step2:在 screen 窗口执行命令
    step3:退出 screen 窗口
       使用 ctrl+a+d 暂时退出 screen 窗口,命令会在后台继续运行
       使用 ctrl + d 或者输入 exit 命令来真正退出当前的 screen 窗口
    step4:查看使用 screen 运行的后台进程列表
       screen -ls 
       或者使用 ps 工具:
       ps aux | grep -E '命令1 | 命令2 | ...' 
       # 可以查看多个在 screen 虚拟出来的终端中跑的后台进程
       # 但是使用 ps aux | grep screen 是看不到的 screen 进程的, screen 并不是进程
    step5:进入运行某个命令的 screen 窗口
       screen -r 进程ID号
       或者 
       screen -r 窗口名
    

    
  查看全部
后台运行命令有下面3中方法:

1、在命令后面加 &
    有可能会在关闭当前终端的时候中断退出
 
2、使用 nohup
    如:nohup sleep 100 &
    会在当前目录生成一个 nohup.out 文件,会收集这个命令在执行过程中产生的日志
    在 crt 这些工具的某些版本也会出现在关闭当前终端的时候中断退出(参考大师兄的分享),这时候可以把命令写到脚本中,然后后台执行脚本。
    使用 jobs 命令可以看到这些后台任务
 
3、使用 screen 工具
    1)安装:yum install -y screen
    2)使用:
    step1:打开 screen 窗口:
        直接打开: screen 
        在打开 screen 窗口的时候,可以给这个窗口命名:screen -S 窗口名
    step2:在 screen 窗口执行命令
    step3:退出 screen 窗口
       使用 ctrl+a+d 暂时退出 screen 窗口,命令会在后台继续运行
       使用 ctrl + d 或者输入 exit 命令来真正退出当前的 screen 窗口
    step4:查看使用 screen 运行的后台进程列表
       screen -ls 
       或者使用 ps 工具:
       ps aux | grep -E '命令1 | 命令2 | ...' 
       # 可以查看多个在 screen 虚拟出来的终端中跑的后台进程
       # 但是使用 ps aux | grep screen 是看不到的 screen 进程的, screen 并不是进程
    step5:进入运行某个命令的 screen 窗口
       screen -r 进程ID号
       或者 
       screen -r 窗口名
    

    
 

主站目录脚本自动更新

A128_huanggr 发表了文章 • 0 个评论 • 582 次浏览 • 2016-03-24 21:38 • 来自相关话题

今接到开发的一个要求,写个脚本,更新主站目录文件 ,要求,先把更新的文件和要更新的文件 分别备份
然后再进行更新覆盖.这样 话就不用每次更新都要人工去做繁琐的事。脚本考虑到了文件是不定的,随时会变更每一个文件。脚本运行前把更新文件目录压缩后上传到目录,运行脚本就行了。

例如开发要更新user目录下的这几个文件 :

user
├── user/access.log
└── user/public_html
├── user/public_html/css
│ ├── user/public_html/css/admin_main.css
│ └── user/public_html/css/user.css
├── user/public_html/img
│ └── user/public_html/img/spirit.png
└── user/public_html/WEB-INF
└── user/public_html/WEB-INF/jsp
└── user/public_html/WEB-INF/jsp/errorPage.jsp

#!/bin/bash


#backup changed deploy
upload=/home/loho88/upload/deploy
changed=/home/loho88/upload/changed

javaproj=/data/www/java-proj/
backup=/home/loho88/upload/backup

date1=`date +%F_%T`
cp $upload/*.zip $changed/loho_"$date1".zip
mv $upload/*.zip /tmp/lin
unzip /tmp/lin/*.zip -d $upload
wcc=`ls -l $upload|grep drw|awk '{print $9}'|wc -l`

for i in `seq $wcc`;do
ml=`ls -l $upload |grep "drw"|awk '{print $9}'|sed -n "$i"p`
mkdir $backup/deploy_"$ml"_"$date1"
cd $upload
tree -f $ml|grep "\." |awk '{print $NF}'>/tmp/aa
ls -R "$upload"/$ml/|grep "\.">/tmp/aaa
hs=`cat /tmp/aaa|wc -l`
for ii in `seq $hs`;do
wj=`sed -n "$ii"p /tmp/aaa`
wj2=`sed -n "$ii"p /tmp/aa`
cd $javaproj
cp -r -f --parents $wj2 $backup/deploy_"$ml"_"$date1"
cp -r -f "$upload"/$wj2 "$javaproj"$wj2

done
:>/tmp/aa
:>/tmp/aaa
rm -fr "$upload"/* && rm -fr /tmp/lin/*
done 查看全部
今接到开发的一个要求,写个脚本,更新主站目录文件 ,要求,先把更新的文件和要更新的文件 分别备份
然后再进行更新覆盖.这样 话就不用每次更新都要人工去做繁琐的事。脚本考虑到了文件是不定的,随时会变更每一个文件。脚本运行前把更新文件目录压缩后上传到目录,运行脚本就行了。

例如开发要更新user目录下的这几个文件 :

user
├── user/access.log
└── user/public_html
├── user/public_html/css
│ ├── user/public_html/css/admin_main.css
│ └── user/public_html/css/user.css
├── user/public_html/img
│ └── user/public_html/img/spirit.png
└── user/public_html/WEB-INF
└── user/public_html/WEB-INF/jsp
└── user/public_html/WEB-INF/jsp/errorPage.jsp

#!/bin/bash


#backup changed deploy
upload=/home/loho88/upload/deploy
changed=/home/loho88/upload/changed

javaproj=/data/www/java-proj/
backup=/home/loho88/upload/backup

date1=`date +%F_%T`
cp $upload/*.zip $changed/loho_"$date1".zip
mv $upload/*.zip /tmp/lin
unzip /tmp/lin/*.zip -d $upload
wcc=`ls -l $upload|grep drw|awk '{print $9}'|wc -l`

for i in `seq $wcc`;do
ml=`ls -l $upload |grep "drw"|awk '{print $9}'|sed -n "$i"p`
mkdir $backup/deploy_"$ml"_"$date1"
cd $upload
tree -f $ml|grep "\." |awk '{print $NF}'>/tmp/aa
ls -R "$upload"/$ml/|grep "\.">/tmp/aaa
hs=`cat /tmp/aaa|wc -l`
for ii in `seq $hs`;do
wj=`sed -n "$ii"p /tmp/aaa`
wj2=`sed -n "$ii"p /tmp/aa`
cd $javaproj
cp -r -f --parents $wj2 $backup/deploy_"$ml"_"$date1"
cp -r -f "$upload"/$wj2 "$javaproj"$wj2

done
:>/tmp/aa
:>/tmp/aaa
rm -fr "$upload"/* && rm -fr /tmp/lin/*
done

用正则表达式匹配IPv6地址

zgtlm 发表了文章 • 0 个评论 • 514 次浏览 • 2016-02-27 14:48 • 来自相关话题

先看一下IPv6地址格式:
没有压缩的时候,是8组16进制数(0-9a-fA-F),每组4个:

2001:0000:1F1F :0000:0000:0100:11A0:ADDF

为了简化其表示法, rfc2373提出每段中前面的0可以省略:

2001:0:1F1F :0:0:100:11A0:ADDF

连续的0可省略为"::",但只能出现一次。

2001:0:1F1F ::100:11A0:ADDF


没有压缩时,正则表达式:
首先构造出8组中的一组,每个十六进制重复4次:

[0-9A-Fa-f]{4}

由于每组中间用冒号隔开,所以需要第一组和后面7个以冒号开头的组。这样就构造出了一个完整的格式

[0-9A-Fa-f]{4}(:[0-9A-Fa-f]{4}){7}


省略每段中前面的0时:
基本上和之前的一样,只是每组的长度是变化的,每组长度1-4个。
首先构造出8组中的一组,每个十六进制重复1~4次:

[0-9A-Fa-f]{1,4}

完整的格式:

[0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){7}

这个格式包含了上面的那种情况。


将连续的0用双冒号压缩时:
这种情况就比较复杂,因为如果不知道双冒号究竟压缩了几个组,也就不知道每个组重复几次。
但是当我知道冒号之前有几个组时,后面就能确定重复几个组了。
第一种情况,当双冒号出现在最开始时,最少压缩2个组,最多压缩7个组。那么双冒号后面可以有1到6组。

:(:[0-9A-Fa-f]{1,4}){1,6}

第二种情况,当双冒号出现在最后时,最少压缩2个组,最多压缩7个组。那么双冒号前面面可以有1到6组。

([0-9A-Fa-f]{1,4}:){1,6}:

第三种情况,当双冒号出现在第1组之后时,最少压缩1个组,最多压缩6个组。那么双冒号后面可以有1到6组。

([0-9A-Fa-f]{1,4}):(:[0-9A-Fa-f]{1,4}){1,6}

第四种情况,当双冒号出现在第2组之后时,最少压缩1个组,最多压缩5个组。那么双冒号后面可以有1到5组。

([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){1,5}

之后几种情况以此类推:

([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){1,4}
([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){1,3}
([0-9A-Fa-f]{1,4}:){5}(:[0-9A-Fa-f]{1,4}){1,2}
([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4})

最后,当出现全部是0时:

::

总结,当出现压缩时,全部情况:

(:[0-9A-Fa-f]{1,4}){1,6}
([0-9A-Fa-f]{1,4}:){1,6}:
([0-9A-Fa-f]{1,4}):(:[0-9A-Fa-f]{1,4}){1,6}
([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){1,5}
([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){1,4}
([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){1,3}
([0-9A-Fa-f]{1,4}:){5}(:[0-9A-Fa-f]{1,4}){1,2}
([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4})
::

不压缩时:

[0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){7}


现在所有的情况都已经包含在内,我们用分支把他们连起来:

([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){7})|(:(:[0-9A-Fa-f]{1,4}){1,6})|(([0-9A-Fa-f]{1,4}:){1,6}:)|(([0-9A-Fa-f]{1,4}):(:[0-9A-Fa-f]{1,4}){1,6})|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){1,5})|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){1,4})|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){1,3})|(([0-9A-Fa-f]{1,4}:){5}(:[0-9A-Fa-f]{1,4}){1,2})|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}))|(::)


测试一下:

ip addr show |grep -E '([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){7})|(:(:[0-9A-Fa-f]{1,4}){1,6})|(([0-9A-Fa-f]{1,4}:){1,6}:)|(([0-9A-Fa-f]{1,4}):(:[0-9A-Fa-f]{1,4}){1,6})|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){1,5})|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){1,4})|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){1,3})|(([0-9A-Fa-f]{1,4}:){5}(:[0-9A-Fa-f]{1,4}){1,2})|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}))|(::)'

    inet6 ::1/128 scope host
    inet6 2607:8700:101:72d9::88/128 scope global
    inet6 2607:8700:101:72d9::/128 scope global
 
 

 
正则表达式可视话工具:
https://jex.im/regulex/ 查看全部
先看一下IPv6地址格式:
没有压缩的时候,是8组16进制数(0-9a-fA-F),每组4个:


2001:0000:1F1F :0000:0000:0100:11A0:ADDF


为了简化其表示法, rfc2373提出每段中前面的0可以省略:


2001:0:1F1F :0:0:100:11A0:ADDF


连续的0可省略为"::",但只能出现一次。


2001:0:1F1F ::100:11A0:ADDF



没有压缩时,正则表达式:
首先构造出8组中的一组,每个十六进制重复4次:


[0-9A-Fa-f]{4}


由于每组中间用冒号隔开,所以需要第一组和后面7个以冒号开头的组。这样就构造出了一个完整的格式


[0-9A-Fa-f]{4}(:[0-9A-Fa-f]{4}){7}



省略每段中前面的0时:
基本上和之前的一样,只是每组的长度是变化的,每组长度1-4个。
首先构造出8组中的一组,每个十六进制重复1~4次:


[0-9A-Fa-f]{1,4}


完整的格式:


[0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){7}


这个格式包含了上面的那种情况。


将连续的0用双冒号压缩时:
这种情况就比较复杂,因为如果不知道双冒号究竟压缩了几个组,也就不知道每个组重复几次。
但是当我知道冒号之前有几个组时,后面就能确定重复几个组了。
第一种情况,当双冒号出现在最开始时,最少压缩2个组,最多压缩7个组。那么双冒号后面可以有1到6组。


:(:[0-9A-Fa-f]{1,4}){1,6}


第二种情况,当双冒号出现在最后时,最少压缩2个组,最多压缩7个组。那么双冒号前面面可以有1到6组。


([0-9A-Fa-f]{1,4}:){1,6}:


第三种情况,当双冒号出现在第1组之后时,最少压缩1个组,最多压缩6个组。那么双冒号后面可以有1到6组。


([0-9A-Fa-f]{1,4}):(:[0-9A-Fa-f]{1,4}){1,6}


第四种情况,当双冒号出现在第2组之后时,最少压缩1个组,最多压缩5个组。那么双冒号后面可以有1到5组。


([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){1,5}


之后几种情况以此类推:


([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){1,4}
([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){1,3}
([0-9A-Fa-f]{1,4}:){5}(:[0-9A-Fa-f]{1,4}){1,2}
([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4})


最后,当出现全部是0时:


::


总结,当出现压缩时,全部情况:


(:[0-9A-Fa-f]{1,4}){1,6}
([0-9A-Fa-f]{1,4}:){1,6}:
([0-9A-Fa-f]{1,4}):(:[0-9A-Fa-f]{1,4}){1,6}
([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){1,5}
([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){1,4}
([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){1,3}
([0-9A-Fa-f]{1,4}:){5}(:[0-9A-Fa-f]{1,4}){1,2}
([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4})
::


不压缩时:


[0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){7}



现在所有的情况都已经包含在内,我们用分支把他们连起来:


([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){7})|(:(:[0-9A-Fa-f]{1,4}){1,6})|(([0-9A-Fa-f]{1,4}:){1,6}:)|(([0-9A-Fa-f]{1,4}):(:[0-9A-Fa-f]{1,4}){1,6})|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){1,5})|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){1,4})|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){1,3})|(([0-9A-Fa-f]{1,4}:){5}(:[0-9A-Fa-f]{1,4}){1,2})|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}))|(::)



测试一下:


ip addr show |grep -E '([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){7})|(:(:[0-9A-Fa-f]{1,4}){1,6})|(([0-9A-Fa-f]{1,4}:){1,6}:)|(([0-9A-Fa-f]{1,4}):(:[0-9A-Fa-f]{1,4}){1,6})|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){1,5})|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){1,4})|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){1,3})|(([0-9A-Fa-f]{1,4}:){5}(:[0-9A-Fa-f]{1,4}){1,2})|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}))|(::)'

    inet6 ::1/128 scope host
    inet6 2607:8700:101:72d9::88/128 scope global
    inet6 2607:8700:101:72d9::/128 scope global
 
 


 
正则表达式可视话工具:
https://jex.im/regulex/