查看硬件信息、系统版本
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