月度存档: 4 月 2020 - 第2页

shell之sort

sort将文件进行排序,并将排序结果标准输出
基本语法: sort(选项)(参数)
选项
-n 按数值大小排序
-r 以相反顺序排序
-t 设置排序时用的分隔字符
-k 指定需要排序的列
参数
指定待排序的文件列表
案例

$cat sed.txt
a b 1
c d 8
e f 5 
g h 6
$sort -t " " -nk 3 sed.txt
a b 1
e f 5 
g h 6
c d 8
$sort -t " " -nrk 3 sed.txt
c d 8
g h 6
e f 5 
a b 1

shell之awk

awk是一个文本分析工具,把文件逐行读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
主要选项:
-F 指定分割符
-v 赋值一个用户定义变量
awk [选项] ‘正则表达式1{action} 正则表达式2{action2}’ filename
案例

$cp /etc/passwd ./
#1.搜索passwd文件以root关键字开头的所有行,并输出该行第7列。
$ awk -F : '/^root/{print $7}' passwd
#2.搜索passwd文件以root关键字开头的所有行,并输出该行第1列和第7列,中间","分割。
$ awk -F : '/^root/{print $1 "," $7}' passwd
#3.只显示/etc/passwd的第一列和第7列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加"ha,/cool/girl"
$awk -F : 'BEGIN{print "user,shell"} {print $1","$7}END{print "ha,/cool/girl"}' passwd
#4.将passwd中用户id(即第3列)增加数值1并输出
$awk -F : -v i=1 '{print $3+i}' passwd
#4.内置变量NF多少列,NR已读的记录数即行数
$awk -F : '{print FILENAME"," NR"," NF}' passwd
#5.查询sed.txt中空格所在的行号
$awk '/^$/{print NR}' sed.txt

shell之sed

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为 “模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一个,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
a add
d delete
s search/replace
-e 几条命令
案例:

$vim sed.txt
a b
c d
e  f

g  h
#1.将“boys”插入到sed.txt的第二行下,打印
$sed "2a boys" sed.txt 
a b
c d
boys
e f 

g h
$cat sed.txt
a b
c d
e f 

g h
#2.删除sed.txt中所有包含c的行
$sed "/c/d" sed.txt
a b
e f 

g h
#3.将sed.txt文件中c替换成haha,全局替换g
$sed "s/c/haha/g" sed.txt
a b
haha d
e f 

g h
#4.将sed.txt中第二行删除并将h替换为haha
$sed -e '2d' -e 's/h/haha/g' sed.txt
a b
e f 

g haha

shell之cut

cut -f 列号 -d 分隔符
案例:

$touch cut.txt
$vim cut.txt
a b
c d
e  f
g  h
#1.获得cut.txt的第一列
$cut -d " " -f 1 cut.txt
a
c
e
g
$cut -d " " -f 2 cut.txt
b
d
$ cut -d " " -f 2,3 cut.txt
b
d
 f
 h
#2.过滤以c开头的行
$cat cut.txt | grep c
c d
#3.获取c
$cat cut.txt | grep c| cut -d " " -f 1
c
#4.选取系统PATH变量值,第2个:开始后的所有路径
$echo $PATH | cut -d : -f 3-
#5.切割ifconfig后打印的ip地址
$ifconfig lo0 | grep "inet " | cut -d " " -f 2

shell知识备查

工作中经常用到shell命令,记录下常用的备查:

1 系统变量$HOME $PWD(当前路径) $USER $SHELL

2 自定义变量

a=1 #注意=附近没有空格
echo $a
1

3 特殊变量$n,$#,$*,$@,$?

#!/bin/bash
#输入参数
echo $0 $1 $2 $3
#打印参数个数
echo $#
#打印所有参数,整体
echo $*
#打印所有参数,区分
echo $@
#上一条命令是否执行成功
echo $?

4 运算符

a=$[(1+2)*4]#(没有空格)
echo $a
expr 1 \* 2 #(有空格)

5 条件判断

[ 2 -ge 1 ] #注意[]有空格2>=1 greater equal
echo $? #0代表执行成功,非0代表没有正常执行

6 流程控制

#if语句注意空格
if [ $1 -eq 1 ];then
echo "this is 1"
elif [ $1 -eq 2 ]
then
echo "this is 2"
fi

#case 语句
case $1 in
1)
echo "case 1"
;;
2)
echo "case 2"
;;
*)
echo "case other"
;;
esac

#for循环
s=0
for((i=1;i<=100;i++))
do
        s=$[$s+$i]
done
echo $s #5050

#for循环2-打印所有输入参数
#所有参数放在一行
for i in "$*"
do 
    echo "input $i"
done

#一个参数一行
for j in $@
do 
    echo "input $j"
done

#while循环
i=0
s=0
while [ $i -le 100 ]
do
    s=$[$s+$i]
    i=$[$i+1]
done
echo $s #output 5050

7 read读取控制台输入

#!/bin/bash
#8秒内输入名字
read -t 8 -p "input your name " NAME
echo $NAME

8 函数

basename /home/1.txt
output: 1.txt
basename /home/1.txt .txt
output 1 #截取文件名称

dirname /home/1.txt
output /home #截取文件路径

#自定义函数

#!/bin/bash
function sum()
{
        s=0
        s=$[$1+$2]
        echo $s
}

read -p "input param1:" p1
read -p "input param2:" p2
sum $p1 $p2

9 Shell tool

cut,sed,awk,sort

docker共享同步文件

启动容器的时候用这样的命令:
docker run -d -p 1234:8080 --name mydef -v /hostpath/share:/usr/local/share -v /hostpath/share2:/usr/local/share2 --privileged-true jingxiangname
其中 privileged-true 代表强制写权限

dockerfile案例2-CMD ENTRYPOINT ONBUILD

先说CMD,以tomcat为例,如果启动容器命令如下:
docker run -it -p 7777:8080 tomcat ls -l
那么,相当于容器对应的dockerfile文件里面加了个
CMD ls -l
这个命令会使dockerfile文件里之前定义的CMD命令失效

而ENTRYPOINT作用是追加,看这个dockerfile:

FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]

build容器命令如下:
docker build -f /pathto/dockerfile -t mydefname:version .
查看容器
docker images mydefname:version
启动容器
docker run mydefname -i
相当于在dockerfile里面
ENTRYPOINT [“curl”,”-s”,”http://ip.cn”]
变成了
ENTRYPOINT [“curl”,”-s”,”-i”,http://ip.cn”]


~~~关于OBNBUILD~~~~~
新建dockerfile_father:

FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]
ONBUILD RUN echo "father onbuild...886"

build image
docker build -f /pathto/dockerfile_father -t myfather .

新建dockerfile_son:

FROM myfather
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]

build image
docker build -f /pathto/dockerfile_son -t myson .
output:
….
“father onbuild…886”
….

dockerfile案例1

目标:
改装阿里云上的centos,让其支持vim和ifconfig命令

1.dockerfile这么写:

FROM centos
MAINTAINER nbllq<nbllq@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80
CMD echo $MYPATH
CMD ech "success----ok"
CMD /bin/bash


2.在当前目录下构建自定义的改装centos镜像

docker build -f /mypath/dockerfile -t mycentos:1.1 .

3.进入容器

docker run -it mycentos:1.1

dockerfile保留字

dockerfile有一些常用保留字,记录一下,以后备查

FROM 基础镜像

MAINTAINER 作者姓名和邮箱

RUN build的时候跑的命令

EXPOSE 容器对外暴露的端口

WORKDIR 登录容器的默认工作目录

ENV 设置环境变量

ADD 将宿主机目录下的文件拷贝进镜像且自动处理url和解压tar包

COPY 将宿主机目录下的文件拷贝进镜像

VOLUME 容器数据卷,数据保存和持久化,即指定宿主机和容器共享目录

CMD 指定容器启动时候执行的命令,只有最后一个生效,cmd会被docker run之后的参数替换

ENTRYPOINT 指定容器启动时候执行的命令,追加执行

ONBUILD 构建一个被继承的dockfile时运行命令,子镜像构建完后的触发命令,即父镜像收尾工作

Docker-start

引子:之前遇到个sb程序用的不同的开发环境导致服务器各种神配置,后来了解到docker似乎可以解决开发环境和部署环境不一致的问题,所以入坑docker,看是不是如大家传说的好用。
官方文档:
https://docs.docker.com/engine/install/centos/

1. 查看服务器版本

cat /etc/redhat-release
要求centos7以上64位服务器才可以安装docker

2.install gcc/c++

yum -y install gcc
yum -y install gcc-c++
gcc -v
my version:
gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)

3.装个仓库

$ sudo yum install -y yum-utils

$ sudo yum-config-manager \
    --add-repo https://download.docker.com/linux/centos/docker-ce.repo

4.更新yum软件包索引

yum makecache fast

5.安装docker-ce

sudo yum install docker-ce docker-ce-cli containerd.io

6.启动docker

systemctl start docker

7.查看docker版本号:

docker version

8.helloworld

docker run hello-world

9.卸载docker

systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker