0%

linux杂记

本文主要包括:

  • shell常用语法
  • shell实用命令

    IF 条件判断

    判断 boot 分区可用容量小于 20MB 时报警,否则显示 OK

    df | grep "boot" | awk ' {if ($4<20000)  print "Alart" ; else print "OK"}'

    While 循环

    指定范围内执行动作

    # 语法一
    awk 'i=1 {} BEGIN {while (i<3) {++i;print i}}' test.txt 
    # 语法二
    awk 'BEGIN {do {++i;print i} while (i<3)}' test.txt

    For 循环

    for (变量;条件;计数器)

    awk 'BEGIN {for (i=1;i<3;i++) print i}' test.txt
    awk 'BEGIN {for (i=3;i>1;i--) print i}' test.txt
    上述 While 和 For 循环语句使用的 awk 均使用 BEGIN 模式,即在未读取文档内容前就会将 BEGIN 代码执行完毕,所以输入文档可以是任意文档。
    具体参考:
    https://blog.csdn.net/sunny_future/article/details/80287236

查询文件下所有文件是否包含某个字符串

find .| xargs grep -ri "class" 

查询文件夹下所有文件既包含AAA又包含BBB字符串

find .| xargs grep -ri "AAA" -l |  xargs grep -ri "BBB"

目录下的所有文件中查找字符串,并且只打印出含有该字符串的文件名

find .| xargs grep -ri "class" -l 

遍历指定文件夹下所有文件

采用递归的方式

function scandir() {
    local cur_dir parent_dir workdir
    workdir=$1
    cd ${workdir}
    if [ ${workdir} = "/" ]
    then
        cur_dir=""
    else
        cur_dir=$(pwd)
    fi

    for dirlist in $(ls ${cur_dir})
    do
        if test -d ${dirlist};then
            cd ${dirlist}
            scandir ${cur_dir}/${dirlist}
            cd ..
        else
            echo ${cur_dir}/${dirlist}
        fi
    done                       
}

if test -d $1                  
then
    scandir $1                 
elif test -f $1                
then
    echo "you input a file but not a directory,pls reinput and try again"
    exit 1
else
    echo "the Directory isn't exist which you input,pls input a new one!!"
    exit 1
fi

利用命令行:

获取bigdata下所有的以.sh结尾的文件

find /home/bigdata -name "*.sh"

参考:
https://blog.csdn.net/u010801696/article/details/78913494

ftp在centos下如何登陆

ftp的登陆方式

ftp
open ip port
## 输入完host以后,会弹出让输入用户名和密码,之后就登陆进去了

sftp的登陆方式

sftp -P port user@ip
## 回车后提示输入密码

lftp(不需要手动输入用户名密码,常用于自动化脚本中)

lftp -u user,psw sftp://ip:host

ftp使用模糊查询下载所有匹配的文件

open 192.168.1.1 10021
prompt   ##取消ftp的交互式,否则每次下载下一个文件都要回车一下,仅对当前窗口有效,ftp退出后,下次进入需要重新prompt
mget 2020-05-12*   #下载正则匹配上的所有文件
get aaa.dat    # 下载指定文件

ubuntu下替换apt-get的源

参考https://www.cnblogs.com/gabin/p/6519352.html

解决出现 unable to resolve host 问题

ubuntu在sudo的时候,总是出现unable to resolve host,解决步骤:

  • 修改 /etc/hosts里的127.0.0.1 localhost 后面加上主机名称(127.0.0.1 localhost aaa)
  • 修改/etc/hostname,这里的名称和上面的主机名称保持一致(aaa)

ssh免秘钥

用过好几次免秘钥,但是每次都会忘了应该把copy谁的公钥到另外用户的.ssh文件夹
这里专门记录一次

A要使用ssh免密登录到B用户下(可以使远程服务器),就把A的用户下的.ssh文件的id_rsa.pub 内容 cat到远程服务器B 的.ssh的authorized_keys 文件里

说明白点就是,A用户如果想免秘钥登录B用户,那么就需要把公钥先让B用户知道。这样就是自己人了。

还有一个注意点:
如果希望ssh公钥生效需满足至少下面两个条件:

  • .ssh目录的权限必须是700
  • .ssh/authorized_keys文件权限必须是600

具体可以参考
https://www.jb51.net/article/94599.htm

awk实现sql中group by,count的功能

awk -F " " '{ w[$2]+=1} END{ for (a in w)  print a, w[a]}' detail.csv  > aaa.txt

可以参考
https://www.cnblogs.com/ginvip/p/6352157.html
http://www.blogjava.net/henry14/archive/2012/01/15/368560.html

自动输入账号密码

借助exact
公司的gitlab禁用了ssh协议,每次pull代码都需要输入账号密码,这里写个脚本自动输入:

#!/usr/bin/expect
set timeout 30
spawn git pull origin master
expect "Username for 'https://xxxx.xxxx.com.cn':"
send "aaa\r"
expect "Password for 'https://xxxx@xxxx.xxxx.com.cn':"
send "**********\r"
interact

这里注意,不用sh这个脚本,需要给这个脚本执行权限,然后./pull.sh

sed命令替换文件内容

sed -i 's/\r//g' ${fileName}

linux转换文件编码

windows下的文件类型为dos,转换成linux,并且把文件编码改成utf-8,否则中文是乱码的

iconv -f GB2312 -t utf8 ima_file.csv -o 1_ima_file.csv

有部分文件报如下错误:

conv: illegal input sequence at position 14876089

这是由于你之前的做的假定有问题。GB2312 是国标里面一个最小也是最早的中文编码标准。其中,只涵盖了 6,763 个汉字。所以你需要转换的文件的原始的格式可能并不是 GB2312 编码。
这个时候,你可以用 GB18030 做为源格式来进行转换。 GB18030 是最新的国家标准,包含了 27,564 个汉字,而且向下兼容 GB2312 和 GBK。

iconv -f GB18030 -t utf8 ima_file.csv -o 1_ima_file.csv

vim打开文件中每行末尾都带有 ^M

因为windows下换行符是\r\n,linux下是\n,多了一个\r

sed -i 's/\r//g' ${fileName}

Centos 翻墙

在 Linux 中使用 Clash

  1. 在 Clash release 页面下载相应的版本,对于 Ubuntu 一般使用 clash-linux-amd64-vX.X.X.gz 版本:

    wget https://github.com/Dreamacro/clash/releases/download/v1.10.0/clash-linux-amd64-v1.10.0.gz
    gunzip clash-linux-amd64-v1.10.0.gz
    mv clash-linux-amd64-v1.10.0 clash
    chmod u+x clash

    Clash 运行时需要 Country.mmdb 文件,当第一次启动 Clash 时(使用 ./clash 命令) 会自动下载(会下载至 /home/XXX/.config/clash 文件夹下)。自动下载可能会因网络原因较慢,可以访问该链接手动下载。

    Country.mmdb 文件利用 GeoIP2 服务能识别互联网用户的地点位置,以供规则分流时使用。

  2. 配置文件

一般的网络服务提供了 Clash 订阅链接,可以直接下载链接指向的文件内容,保存到 config.yaml 中。或者使用订阅转换服务(如该链接。也可以自行搭建,可参考该文章),将其它订阅转换为 Clash 订阅。

这里推荐使用订阅转换服务,转换后的配置文件已添加更为强大的分流规则。就可以将 Clash 一直保持后台运行,自动分流,且会自动选择最优节点。

如果使用订阅转换服务,对于转换后的订阅链接,可以使用以下命令来下载配置文件:

curl -o config.yaml 'longURL'
  1. Clash as a daemon
    将 Clash 转变为系统服务,从而使得 Clash 实现常驻后台运行、开机自启动等。
    Linux 系统使用 systemd 作为启动服务器管理机制,首先把 Clash 可执行文件拷贝到 /usr/local/bin 目录,相关配置拷贝到 /etc/clash 目录。
    sudo mkdir /etc/clash
    sudo cp clash /usr/local/bin
    sudo cp config.yaml /etc/clash/
    sudo cp Country.mmdb /etc/clash/
    创建 systemd 服务配置文件 sudo vim /etc/systemd/system/clash.service:
    [Unit]
    Description=Clash daemon, A rule-based proxy in Go.
    After=network.target
    
    [Service]
    Type=simple
    Restart=always
    ExecStart=/usr/local/bin/clash -d /etc/clash
    
    [Install]
    WantedBy=multi-user.target
    使用 systemctl
    使用以下命令,让 Clash 开机自启动:
    # 开机自启
    sudo systemctl enable clash
    # 开启 Clash
    sudo systemctl start clash
    # 查看 Clash 日志
    sudo systemctl status clash
    sudo journalctl -xe
    这里启动完了以后,还需要开启系统代理。需要查一下centos怎么开启系统代理
    export https_proxy=http://127.0.0.1:9981
    export http_proxy=http://127.0.0.1:9981
    打开浏览器,输入http://clash.razord.top/#/proxies进行clash的配置
    host就是服务器IP,端口就是external-controller后的端口,这里要注意,external-controller: 0.0.0.0:19090
    否则会telnet不通,然后在页面上就可以选择服务节点了
    clash网页配置

注意: 这里不要使用谷歌浏览器打开这个网址,新版谷歌浏览器调整了安全策略,直接打开这个网址会被pass掉,这里使用safri浏览器是可以的

解决办法:
a.浏览器版本108.x.xxxx以前:请在浏览器地址栏输入 chrome://flags/#block-insecure-private-network-requests 关闭(disable)阻止不安全的专用网络请求功能,否则可能无法正常登录。
b.浏览器版本108.x.xxxx以后:请在浏览器地址栏输入chrome://flags/#Insecure-origins-treated-as-secure ;然后点击允许(Enable)按钮,在文本框输入需要设定的在线面板地址,如:所有面板地址 ;最后点击右下方的 重载按钮(Relaunch)

Ubuntu设置Clash

git clone git@github.com:gujincheng/clash-for-linux.git
# 先修改start.sh里的内容,然后运行它
sh start.sh
source /etc/profile.d/clash.sh

字符串转数组操作

function handle_group_col(){
    array=(${groupBy//,/ })
    resStr=""

    for(( i=0;i<${#array[@]};i++))
    do
        column="round(${array[i]})"
        if [[ $i == 0 ]];then
            resStr=$column
        else
            resStr="${resStr},${column}";
        fi
    done
    echo $resStr

}
groupBy="aaa,bbb"
handle_group_col

具体可以参考在 Linux 中使用 Clash

Ubuntu修改命令提示符PS1教程

命令多行输入不方便也不直观,要想修改这个命令提示符。修改~/.bashrc文件中的PS1即可。

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\W\$ '
fi

把小写的w改成大写的W