Avatar

Organizations

  • sed [OPTION] [expression] file
    
    [OPTION]
      -n 屏蔽输出
      -i 替换模式
      -i.bak 替换前先备份文件
      -E 使用扩展正则表达式,语法更接近现代正则表达式(如 Perl、Python、JavaScript),代码更清晰易读(去掉了很多反斜杠),减少转义错误
      -e 使用表达式,可使用多个表达式
    
    [expression]
      s/regular/replace/ 替换命令
      
      0,/regular/s//replace/ 仅替换从文件开头(第 0 行)首次匹配regular成功的内容,只用GNU版本的sed
      
      /regular/replace/g 匹配整行,默认只匹配一次
      /regular/replace/d 删除行
      /regular/replace/p 打印匹配的行
    

    读取指定行

    sed -n '1,2p' file
    

    删除行

    # 删除空行
    sed -i '/^\s*$/d' merge1.log
    sed -i '/^$/d' filename.txt  # `^$` 匹配空行
    # 按行号删除
    sed -i '5d' filename.txt  # 删除第5行
    # 删除最后一行
    sed -i '$d' filename.txt  # `$` 表示最后一行
    # 删除连续行
    sed -i '10,20d' filename.txt  # 删除第10到20行
    # 删除不连续的行
    sed -i '5d;10d;15d' filename.txt  # 删除第5、10、15行
    # 删除包含特定文本的行
    sed -i '/pattern/d' filename.txt  # 删除含"pattern"的行
    # 删除不匹配的行(保留匹配行)
    sed -i '/pattern/!d' filename.txt  # `!` 表示取反
    # 删除以某文本开头/结尾的行
    sed -i '/^prefix/d' filename.txt  # 删除以"prefix"开头的行
    sed -i '/suffix$/d' filename.txt  # 删除以"suffix"结尾的行
    

    删除冗余信息

    sed -i 's/.*a2p_replyclient_log.*[infoerror].[0-9].log.gz://' merge.log \
    && sed -i 's/org.springframework.amqp.rabbit.RabbitListenerEndpointContainer.* - //' merge.log \
    && sed -i '/.*send 1 time for the url is .*/d' merge.log \
    && sed -i '/.*redis key:[0-9]*,value:.*/d' merge.log
    
    sed -i '/>>>>.* retry:2/d' 2021.8.log
    sed -i 's/the content of the url:.*receiveStatusReportResultChinaMobile.shtml //' 2021.8.log
    

    删除毫秒

    sed -i 's/\.[0-9]\{0,3\}\( \[\)/\1/' merge.log
    

    删除时间

    sed -i 's/.*\(\[INFO\]\)/\1/' 2021.8.log
    sed -i 's/.*\(\[ERROR\]\)/\1/' 2021.8.log
    sed -i 's/time:.*,\(is_china_mobile\)/\1/' 2021.8.log
    

    删除冗余字符

    sed -i 's/error for the url//' merge.log
    sed -i 's/can not read content from the url//' merge.log
    

    统计

    sed -n '/ status:DELIVRD,/p' result.log | wc -l
    sed -n '/"originalStatus":"DELIVRD"/p' merge.log | wc -l
    

    去重复

    awk '!x[$0]++' merge.log
    sort -n merge.log | uniq
    

    修改Ubuntu源地址

    sudo sed -i 's/\(archive\|security\).ubuntu/mirrors.aliyun/' /etc/apt/sources.list
    

    SSH连接不自动断开

    sed -i 's/^#\(ClientAliveInterval\) 0$/\1 60/g' /etc/ssh/sshd_config
    sed -i 's/^#\(ClientAliveCountMax\) 3$/\1 5/g' /etc/ssh/sshd_config
    systemctl restart sshd
    

    /etc/hosts

    # sed 参考 http://man.linuxde.net/sed
            #  https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html
    sed ......
    

    参考文档

    sed CLI Linux Created Mon, 17 Jan 2022 11:18:47 +0800
  • 初始化配置

    # 配置时区
    timedatectl set-timezone Asia/Shanghai
    
    # 关闭邮件服务
    systemctl stop 'postfix@*' ; systemctl disable 'postfix@\x2a' ; apt purge postfix
    
    # 配置Shell提示符
    echo "PS1='\[\e[36;40m\][\D{%Y-%m-%d} \A] \[\e[0m\] \[\e[35;40m\]\w\[\e[0m\]\n\[\e[33;40m\][\u@\H]\[\e[0m\] \\$ '" >> ~/.bashrc
    # 打开自定义命令
    sed -E -i.bak \
        -e '/(export|eval|alias (ls|ll|l|rm|cp|mv))/s/^# //' ~/.bashrc \
        && . ~/.bashrc
    
    # 配置 sshd
    # 允许root密码登录
    # 允许密码登录
    # 解决SSH自动断开问题
    sed -E -i.bak \
        -e 's/#(Port 22)/\1/' \
        -e 's/#(PermitRootLogin) prohibit-password/\1 yes/' \
        -e 's/#(PubkeyAuthentication yes)/\1/' \
        -e 's/#(PasswordAuthentication yes)/\1/' \
        -e 's/#(AllowTcpForwarding yes)/\1/' \
        -e 's/(X11Forwarding yes)/#\1/' \
        -e 's/#(Compression delayed)/\1/' \
        -e 's/#(ClientAliveInterval) 0/\1 60/' \
        -e 's/#(ClientAliveCountMax) 3/\1 3/' \
        /etc/ssh/sshd_config \
        && systemctl restart sshd.service
    

    软件更新

    软件库管理

    CLI bash ssh top linux Created Mon, 17 Jan 2022 11:07:07 +0800
  • 设置流程

    1. 自定义域名

    • 在"theme/<YouThemeName>/static"目录下,添加CNAME文件,里面放自定义的域名
    blog.cuile.com
    

    上传后,Settings > Pages > Custom domain 设置中会出现自定义的域名

    • 修改 baseurl
    # config/_default/config.toml
    ...
    baseurl = "https://blog.cuile.com/"
    ...
    

    2. GitHub Pages 设置

    • Settings > Pages > Build and deployment > Source
      • 选择 “Deploy from a branch”
    • Settings > Pages > Build and deployment > Branch
      • 选择 “gh-pages” & “/(root)”

    其它不过多说明了,网上教程非常多,可以找来看。

    参考文档

    各种坑位

    1. 网页正常部署后,访问时页面却无法正常显示,部局完全是乱的。

    这可能是https请求报"block:mixed-content"错误导致的,是浏览器不允许在https页面里嵌入http的请求,现在高版本的浏览器为了用户体验,都不会弹窗报错,只会在控制台上打印一条错误信息。

    解决这个问题,可以从以下2点入手:

    • 在"theme/<YouThemeName>/layouts/partials/head.html"文件内,添加代码
    <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
    

    https请求报错block:mixed-content问题的解决办法

    • 确保config.toml文件内,“baseUrl"的值与实际地址一致。

    2. config.toml 里的 theme 值,要与主题文档夹名一致,不然可能会导致主题无法应用的问题。

    3. Github Actions 设置

    • “Setup Hugo"项目里,标准版本与扩展版本的参数写法不一样。
    # 使用扩展版本
    - name: Setup Hugo
      uses: peaceiris/actions-hugo@v2
      with:
        hugo-version: '0.92.0'
        extended: true
    
    # 使用标准版本
    - name: Setup Hugo
      uses: peaceiris/actions-hugo@v2
      with:
        hugo-version: 'latest'
    

    GitHub Actions for Hugo

    Hugo Github Action Blog Created Fri, 14 Jan 2022 17:15:06 +0800
  • 镜像列表

    [docker|podman] image ls -a
    # or
    [docker|podman] images
    

    容器列表

    [docker|podman] container ls -a
    # or
    [docker|podman] ps
    

    查看输出

    [docker|podman] compose -f <yaml_file> logs [-f] [service name]
    # or
    [docker|podman] logs [-f] [container id]
    

    验证配置文件

    [docker|podman] compose -f <yaml_file> config
    

    删除冗余镜像

    echo 'y' | [docker|podman] system prune
    

    导入导出镜像

    # 导出
    [docker|podman] save -o <image>.tar <image_name:label | image_id>
    # 导入
    # 使用image_id导出的镜像,导入时也没有名字
    [docker|podman] load -i <image>.tar
    

    不启动镜像,查看镜像内的文件

    # 创建临时容器
    [docker|podman] conatiner create --name <container_name> <image_name>
    # 从容器复制文件到宿主机
    [docker|podman] conatiner cp <container_name>:<file_path> <dest_path>
    # 清理临时窗口
    [docker|podman] container rm <container_name>
    

    创建桥接网络

    [docker|podman] network create [name]
    

    [docker|podman]快捷命令

    echo "alias d-ll='[docker|podman] image ls -a; echo; [docker|podman] container ls -a'" >> ~/.bashrc \
        && echo "alias d-ps='[docker|podman] ps'" >> ~/.bashrc \
        && echo "alias d-clean='[docker|podman] system prune -f'" >> ~/.bashrc \
        && echo "alias d-rm='_a(){ [docker|podman] image rm $1; echo; [docker|podman] container rm $1; }; _a'" >> ~/.bashrc \
        && echo "alias d-exec='_a(){ [docker|podman] exec -it $1 /bin/bash; }; _a'" >> ~/.bashrc \
        && echo "alias d-stop='_a(){ [docker|podman] container stop $1; }; _a'" >> ~/.bashrc \
        && echo "alias d-kill='_a(){ [docker|podman] container kill $1; }; _a'" >> ~/.bashrc
        
    source ~/.bashrc
    
    CLI docker podman container Created Thu, 13 Jan 2022 22:20:52 +0800
  • Python 的 pypi.python.org 站点终于要退休了,而新的接任者 pypi.org 无论从美观、风格上都让人大大的喜欢,终于在审美一这项上及格了。

    而且新的 pypi.org 能够正确的渲染 Markdown 格式的描述,实在是让人欣慰,终于可以和 Github 同步了,不用在麻烦的转换一次了。

    下面就来聊聊,如何正确的把库发布到 pypi.org 上:

    1. 注册 pypi.org 账号

    嗯,这是正确的废话!

    2. 编写 setup.py

    setup.py 的内容比较重要,但其它的细节不谈,主要聊聊 long_description 部分,这部分是对库能力的详细描述。

    如果说 keywords 和 description 能提高别人搜索到项目的概率的话,那 long_description 就在很大程度上决定别人对你对项目有没有进一步的想法了。

    在针对 long_description 的网上介绍中,对具体使用方法明确写出的是少之又少,所以我今天就特别举例说明一下。

    2.1 setup.py

    #!/usr/bin/env python
    # coding: utf-8
    
    from setuptools import setup
    
    setup(
    name='sequence2hash',
    version='1.1.2',
    keywords='tuple dict list sequence hash key/value',
    packages=['sequence2hash'],
    
    url='https://github.com/Cuile/sequence2hash',
    description='This tool converts a valid value in a sequence to a hash and contains a path to a valid value in the key field',
    long_description_content_type='text/markdown',
    long_description=open('README.md', encoding='utf8').read(),
    
    author='cuile',
    author_email='[email protected]'
    )
    

    2.2 读取 readme.md 文件

    long_description=open('README.md', encoding='utf8').read()
    

    这句代码是较少明确说明的,可以不引用 io 库,而直接使用 open 函数读取文件内容,由于 pypi.org 支持 Markdown ,所以可以和 Github 使用同一份 README.md 文件。

    PyPi Python Created Fri, 11 May 2018 14:49:57 +0800