shell命令笔记

4 篇文章 0 订阅

查看硬件信息、系统版本

echo -e "=================================\ncpu nums:\c" && \
cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l && \
cat /proc/cpuinfo |grep "cores"|uniq |sed s/[[:space:]]//g && \
echo -e "logical core nums:\c" && cat /proc/cpuinfo| grep "processor"| wc -l && \
echo -e "CPU:\c" && cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq  && \
free -g|grep :|awk -F '[ ;]+' '{print $1,$2}' && \
cat /etc/system-release||cat /etc/issue &&\
echo "" && \
lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,ROTA 或者 df -Th |grep  ^[F/]  ROTA:1=普通硬盘,0=SSD/U盘

查看分区
fdisk -l
df -h

查看系统版本
cat /etc/redhat-release
cat /etc/centos-release
cat /etc/issue

 查看IO

查看IO使用情况、读写速度
iotop
iostat
测试磁盘读取速度
hdparm -t --direct /dev/sda
测试磁盘写入速度
time dd if=/dev/zero of=/ssd/test.dbf bs=8k count=30000
查看文件夹大小
du -h --max-depth=1 /opt/hadoop-2.7.6

查看文件内容(head 当前集合前240行,tail,当前集合后40行,结合起来就是200-240行)
cat file_name | head -n 240 | tail -n 40

查看文件编码等信息 file a.txt

转换文件编码
iconv -f gb18030 -t utf-8 -c '/home/1.csv'>/home/2.csv  (-c为忽略错误)

cp文件,跳过部分子文件(注意data为相对路径,即hadoop-2.7.6目录下的data目录)https://www.cnblogs.com/hubavyn/p/5452039.html

rsync -av --exclude "data" /opt/hadoop-2.7.6 /data/hadoop_without_data
同步到远程文件夹,此处是排除了/infa_shared/info_xfs/infa_shared/messagefile/sourcefilexsg,将/infa_shared/info_xfs/infa_shared发送到远程目录下
rsync -av -e ssh --exclude "messagefile/sourcefilexsg" /infa_shared/info_xfs/infa_shared etl@200.201.202.32:/infa_shared/info_xfs/

查找(忽略无权限错误):find / -name a.txt 2>/dev/null

输出日志到日期名称的文件:echo 123 >./logs/`date '+%Y-%m-%d-%H-%M-%S'`.log  2>&1 

获取时间戳:date +%s             时间戳转日期:date -d "@1279592730"

后台执行并输出日志(注意python使用nohup时要加-u取消缓存,才能立即输出日志到文件):nohup /usr/bin/python -u /main_Spider.py > /logs/main_Spider.log 2>&1 &

查看ip ifconfig

 shell变量字符串处理

定义一个变量为:
file=/dir1/dir2/dir3/my.file.txt

可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 /  及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 .  及其左边的字符串:file.txt
${file##*.}:删掉最后一个 .  及其左边的字符串:txt
${file%/*}:删掉最后一个  /  及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 /  及其右边的字符串:(空值)
${file%.*}:删掉最后一个  .  及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个  .   及其右边的字符串:/dir1/dir2/dir3/my

空格用[[:space:]]表示,${line##*[[:space:]]}

记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2

也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt

${#var} 可计算出变量值的长度

shell调用脚本,传入带空格的参数

#!/bin/bash
#当前sh所在文件夹路径
localpath=$(cd `dirname $0`; pwd)
#当前时间
time=$(date "+%Y%m%d%H%M%S")

python3=/home/etl/anaconda/bin/python
$python3 $localpath/DataWatcher.py "$@" 


调用方式
/DataWatcher.sh "select count(1) from scott.t3" 20001 "<=2" 30 150
关键在于从外部向shell传入参数和从shell内部向python传入参数时都要加双引号,即"select ... from"和"$@" 

shell去除文件bom头,解决#!/bin/bash文件不存在的问题

sed -i 's/^\xEF\xBB\xBF//g' test.txt

vim操作

:s/old/new/  替换当前行第一个old为new
:s/old/new/g 替换当前行所有old为new
:1,$ s/old/new/g 替换第一行到最后一行所有old为new(即全部替换)  此处1,$即指定替换范围为第一行到最后一行

$  移动光标到当前行末尾
:$ 移动光标到最后一行开头,再按$到该行末尾
:1 移动光标到第一行开头

u  撤销上一步的操作

:r !echo $HIVE_HOME 将shell命令的结果插入到当前行的下一行

:set list 显示不可见字符

从windows拷贝到linux的sh文件无法执行,需要在linux下重新编写,或者使用dos2unix转化文件为linux系统的格式,执行前需授权chmod 777授权,开头需为#!/bin/bash

解决python#!的编码问题 /usr/bin/python3.6^M: bad interpreter

在vim中  :set ff=unix 即可

免密登录
ssh-keygen -t rsa	一路enter
ssh-copy-id zx105	期间需要手动输入目标机器hadoop账户的密码

多次配置连接同一机器导致报错
vim  /home/hadoop/.ssh/known_hosts
删除该主机对应的记录,重新配置即可

利用管道批量操作,列出文件绝对路径,并批量操作

ls /share/109backup |awk '{print i$0}' i=`pwd`'/' |xargs echo 

批量杀死包含特定字符串的进程

ps -efww|grep chromedriver|grep -v grep|cut -c 9-15|xargs kill -9

利用for循环遍历文件夹

#!/bin/bash
export dir=$(dirname $0)/original_ad_part1_in
echo $dir
row_sum=0
for line in $dir/*
do
        row=`grep -c "," $line`
        echo "${line##*/} : $row"
        row_sum=$(($row_sum + $row))
done
echo row_sum=$row_sum

利用管道遍历

#!/bin/bash
export dir=$JAVA_HOME
count=0
ls $dir|while read line
do
        echo "$count $line\n"
        let "count++"
done

注意使用以上方法遍历时循环体在子线程中产生,可以使用父线程的变量,但是对变量赋值后无法传回父线程,解决方法是使用for循环遍历,参考网页shell 循环变量传递问题_光头阿瓜的博客-CSDN博客

查看计算机系统配置

echo -e "=================================\ncpu nums:\c" && \
cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l && \
cat /proc/cpuinfo |grep "cores"|uniq |sed s/[[:space:]]//g && \
echo -e "logical core nums:\c" && cat /proc/cpuinfo| grep "processor"| wc -l && \
echo -e "CPU:\c" && cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq  && \
free -g|grep :|awk -F '[ ;]+' '{print $1,$2}' && \
echo "" && \
lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,ROTA

根据字符串截取路径和文件名

a="/sh/original_ad/row_count.sh"
[hadoop@zx105 ~]$ echo ${a%/*}
/sh/original_ad
[hadoop@zx105 ~]$ echo ${a##*/}
row_count.sh

getopts读取参数示例

#!/bin/bash
while getopts ":u:p:H:P:sk" opt 
#列举可能的选项,后面加:表明该项必须带参数
do
        case $opt in
                u ) user=$OPTARG;;
                p ) passwd=$OPTARG;;
                H ) host=$OPTARG;;
                P ) port=$OPTARG;;
                s ) show=1;;
                k ) ki=1;;
                #while中":u:p:"第一个字符为:时,会抑制错误,下一句的$OPTARG才能显示无效选项,否则为空
                ? ) echo -e "Invalid option: -$OPTARG , Please give these options: \n -u --> usr \n -p --> passwd \n -H --> host \n -P --> port"
                    exit 1;;
        esac
done
shift $(($OPTIND - 1)) #此处之后可以使用$1、$2获取后面的参数
echo user=$user passwd=$passwd host=$host port=$port
echo $1

连接ftp

ftp   进入ftp命令行
open  连接
172.16.206.** 1209
user
passwd
pwd  显示当前目录
dir  显示当前目录文件
bye  退出

sed替换文件中的字符串

注意单双引号,此方法也适用于有特殊字符的替换
oldstr='fgrw_#R3_3$@'
newstr='fewfrt4@331de'
echo $oldstr  ~~  $newstr
sed -i "s/$oldstr/$newstr/g" /u01/data/app.json

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值