博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux Daily2
阅读量:5911 次
发布时间:2019-06-19

本文共 14071 字,大约阅读时间需要 46 分钟。

1. 文件编码

查看文件编码格式

# vi .vimrc:set fileencoding  fileencoding=utf8set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,latin1# vi XXX.file:set fencs?  fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,latin1:set fenc?  fileencoding=cp936:set enc?  encoding=utf-8

cat文件乱码

Windows下生成的纯文本文件,其中文编码为GBK,在Ubuntu下显示为乱码,可以使用iconv命令进行转换:

# iconv -f gbk -t utf8 source_file > target_fileiconv: 未知 5 处的非法输入序列

GBK转码实践

#!/bin/bashif [ "$#" != "2" ]; then  echo "Usage: `basename $0` dir filter"  exitfidir=$1filter=$2echo $1for file in `find $dir -name "$2"`; do  echo "$file"  iconv -f gbk -t utf8 -o $file $filedone

执行方式: 第一个参数是目录, 第二个是文件选择

~/ftp/GBK2UTF-8_batch.sh ./  M_EP_PD_AQI*~/ftp/GBK2UTF-8_batch.sh ./  M_EP_PH_AQI*~/ftp/GBK2UTF-8_batch.sh ./  M_METE_CITY_PRED*~/ftp/GBK2UTF-8_batch.sh ./  M_METE_WEATHER_LIVE*

执行最后一个, 文件>32kb, 报错:

4361 总线错误 (core dumped) iconv -c -f gbk -t utf8 -o $file $file

解决方式:

还是不行:
使用//IGNORE, 成功!

iconv -f gbk//IGNORE -t utf8//IGNORE $file -o $file.tmp

注意原始文件必须是和-f对应,如果原始文件是utf8, 要再次转换成utf8, 也会报错.

GBK2UTF8.sh

#!/bin/bashif [ "$#" != "2" ]; then  echo "Usage: `basename $0` dir filter"  echo "sample: ./GBK2UTF8.sh /home/midd/ftp/fz12345/back/2015-03 fz12345_*.txt"  exitfidir=$1filter=$2tmp='T'echo $1for file in `find $dir -name "$2"`; do  echo "$file"  #iconv -f gbk -t utf8 -o $file $file  #Notic, the Source File should not utf8 format. or u 'll get error  iconv -f gbk//IGNORE -t utf8//IGNORE $file -o $tmp$filedone

磁盘

查看文件大小

ll -h只能查看文件的大小. 不能查看文件夹占用的大小.

查看某个目录总的大小

cd dirdu -h ./

在最后会列出这个文件夹占用的大小. 或者不用cd, 直接du -h dir

扩容操作

查看磁盘使用量: df -mh

根目录/达到了100% : /dev/mapper/vg_datanode01-LogVol00

查看卷: vgdisplan:

---Volume group ---VG Name    vg_datanode01--- Logical volume ---LV Path      /dev/vg_datanode01/LogVol00

扩容:

lvextend -L +10G  /dev/mapper/vg_datanode01-LogVol00resize2fs /dev/mapper/vg_datanode01-LogVol00

3. 系统

文件数和进程数

[midd@datanode01 ~]$ ulimit -acore file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 62700max locked memory       (kbytes, -l) 64max memory size         (kbytes, -m) unlimitedopen files                      (-n) 1024pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 10240cpu time               (seconds, -t) unlimitedmax user processes              (-u) 1024virtual memory          (kbytes, -v) unlimitedfile locks                      (-x) unlimited[midd@datanode01 ~]$ ps -ef | grep ETLmidd     14369     1  0 Mar29 ?        00:00:00 ETL_ScheduleCenter     midd     14370 14369 99 Mar29 ?        5-06:14:46 ETL_ScheduleServer     midd     14442 14369  6 Mar29 ?        02:33:41 ETL_ServerManger       midd     41892 41839  0 10:19 pts/3    00:00:00 grep ETL[midd@datanode01 ~]$ lsof -p 14369 | wc -l20[midd@datanode01 ~]$ lsof -p 14370 | wc -l928[midd@datanode01 ~]$ lsof -p 14442 | wc -l4169[midd@datanode01 ~]$ cat /proc/sys/fs/file-max792049[midd@datanode01 ~]$ su - [root@datanode01 ~]# vi /etc/security/limits.conf* soft nofile 65536 * hard nofile 65536添加以上, 其中*表示任何用户.  注意要用root用户执行.

或者使用root用户添加指定用户的文件数和进程数:

echo '########################for ETL 4.1.0' >> /etc/security/limits.confecho 'midd soft nofile 65536' >> /etc/security/limits.confecho 'midd hard nofile 65536' >> /etc/security/limits.confecho 'midd soft nproc 131072' >> /etc/security/limits.confecho 'midd hard nproc 131072' >> /etc/security/limits.confecho 'midd soft nofile 65536' >> /etc/security/limits.confecho 'midd hard nofile 65536' >> /etc/security/limits.confecho 'midd soft nproc 131072' >> /etc/security/limits.confecho 'midd hard nproc 131072' >> /etc/security/limits.conf

然后使用midd用户验证ulimit

[midd@datanode01 ~]$ ulimit -acore file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 62700max locked memory       (kbytes, -l) 64max memory size         (kbytes, -m) unlimitedopen files                      (-n) 65536pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 10240cpu time               (seconds, -t) unlimitedmax user processes              (-u) 131072virtual memory          (kbytes, -v) unlimitedfile locks                      (-x) unlimited

另外方法:

1.使用ps -ef |grep java   (java代表你程序,查看你程序进程) 查看你的进程ID,记录ID号,假设进程ID为122.使用:lsof -p 12 | wc -l    查看当前进程id为12的 文件操作状况    执行该命令出现文件使用情况为 10523.使用命令:ulimit -a   查看每个用户允许打开的最大文件数    发现系统默认的是open files (-n) 1024,问题就出现在这里。4.然后执行:ulimit -n 4096     将open files (-n) 1024 设置成open files (-n) 4096这样就增大了用户允许打开的最大文件数

内存/进程

freefree -m     以MB为单位free -g     以GB为单位dfdf -m       以MBdf -h       以人类(human)可读的, 即GBpstree -p | wc -l

进程和端口

根据端口号查询进程名字

lsof -Pnl +M -i4[i6] | grep 20880

top命令

按M可以按照Memory排序, 按P按照CPU排序按u可以选择指定的user, 只显示该用户的进程top -p $(pidof mongod)      只显示指定的进程  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                       4735 midd      20   0 30.1g 748m 4944 S  2.0  9.5 102:39.94 mongod

killall 命令可以杀死同一个进程的所有子进程.

如果用ps -ef | grep 则要一个一个杀.
比如ps -ef | grep ETL 显示一共由三个相关进程

[midd@datanode01 bin]$ ps -ef | grep ETLmidd      4812 41955  0 16:01 pts/3    00:00:00 grep ETLmidd     42276     1  0 15:52 ?        00:00:00 ETL_ScheduleCenter     midd     42277 42276 99 15:52 ?        00:15:35 ETL_ScheduleServer     midd     42345 42276  7 15:53 ?        00:00:34 ETL_ServerManger

而用killall 只需要一行: killall ScheduleCenter

用户和权限

添加用户, 设置密码

useradd -d /home/postgres postgres passwd postgres

更改读写权限, 地柜目录使用大写的R. (注意scp时用的是小写的r)

chmod 755 filechmod -R 755 folder

更改用户名:组

chown hadoop:hadoop -R folder

定时任务cron

1.编写脚本

# vi /usr/lib/zookeeper/bin/cron.day #bin/shcd /usr/lib/zookeeper/bin./zkCleanup.sh /opt/hadoop/zookeeper/version-2 5echo 'clean up end...'

2.更改脚本权限

# chmod 755 /usr/lib/zookeeper/bin/cron.day

3.定时调度策略

# cd /etc/cron.d# vi /etc/cron.d/zk.cron 0 13 * * * root run-parts /usr/lib/zookeeper/bin/cron.day

4.导入调度配置

# crontab zk.cron

5.查看调度列表

# crontab -l0 13 * * * root run-parts /usr/lib/zookeeper/bin/cron.day

6.查看是否调度的日志

# tail -f /var/log/cronApr  1 13:00:01 namenode02 CROND[41859]: (root) CMD (root run-parts /usr/lib/zookeeper/bin/cron.day)

其他知识点:

# vi /etc/crontabSHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootHOME=/# For details see man 4 crontabs# Example of job definition:# .---------------- minute (0 - 59)# |  .------------- hour (0 - 23)# |  |  .---------- day of month (1 - 31)# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat# |  |  |  |  |# *  *  *  *  * user-name command to be executed

4. 文件操作

wordcount计数

计算文件的行数: wc -l file.txt

要统计单词数量, 加上w选项. L选项表示最长行的长度. 注意这是一整行.不能按照列计算最长长度.

帮助信息: $ wc --help. 如果不知道一个命令, 最好看看--help

用法:wc [选项]... [文件]... 或:wc [选项]... --files0-from=F  -c, --bytes            print the byte counts  -m, --chars            print the character counts  -l, --lines            print the newline counts  -L, --max-line-length 显示最长行的长度  -w, --words           显示单词计数      --help        显示此帮助信息并退出      --version     显示版本信息并退出

grep查找

ps -ef | grep ETL  查看进程cat fz12345_original.txt | grep FZ15032700599 查找一个文件里的字符串

查找目录下的文件里的内容

cat foder/*.* | grep XXXfind /etc/ -name "*" | xargs grep XXX

注意: 第一个cat命令无法用于递归子目录, 第二个命令/etc后面必须跟上/, 而且name是*

大文件定位到某一行

sed -n '111,112p' file.txt

find文件名

在指定目录查找文件名: find ~/repo -name *tmp*

使用管道, xargs表示递归找到的每个值. 如果是文件, 使用rm. 如果是文件夹, 用rm -rf.

递归删除svn文件夹: find SVNFOLDER -name .svn | xargs rm -rf
递归删除文件: find ~/repo -name *tmp* | xargs rm

文件内容替换

\n替换为, :%s/\n/,/

ORACLE类型转换为hive类型:

%s/STRING(.*)/STRING/%s/VARCHAR2(.*)/STRING/%s/CHAR(.*)/STRING/%s/DATE,/STRING,/%s/date,/STRING,/%s/INTEGER/INT/%s/NUMBER(..)/BIGINT/%s/NUMBER(.)/INT/%s/NUMBER(.*)/DOUBLE/%s/.not null//

rename批量修改文件名

rename .XLS .xlsx *.XLS     把文件名=.XLS的替换成.xlsxrename \_linux '' *.txt         把文件名=_linux的替换成空, 注意_要用转义, 即去掉文件名包含_linux的rename -Unlicensed- '' *.xlsx

exp脚本

dacp_720.exp#!/usr/bin/expectset tableName [lindex $argv 0]#spawn ssh dacp@172.17.212.72 /home/dacp/dp-executor/dacp-dp-executor-1.0.0.RELEASE/go.sh \#20141218 lhx_fzdc_test01spawn ssh dacp@172.17.212.72 \/home/dacp/dp-executor/dacp-dp-executor-1.0.0.RELEASE/go.sh 20141218 $tableNameexpect "password:"send "dacp@123\n"interact

自动交互

ftp文件夹下载

wget * --ftp-user=ftpd --ftp-password=ftpd123 -r

*必须要有, 最后的-r表示目录下载

wget -r -l 1

文件续传: wget -c xxx.file

文件按行数分割

$ wc -l dispatch2012.csv 231272 dispatch2012.csv$ split -l 60000 dispatch2012.csv dispatch2012_new.csv $ ll-rw-r--r-- 1 hadoop hadoop 27649615  9月 27  2014 dispatch2012.csv-rw-rw-r-- 1 hadoop hadoop  7115577  4月 14 19:08 dispatch2012_new.csvaa-rw-rw-r-- 1 hadoop hadoop  7188497  4月 14 19:08 dispatch2012_new.csvab-rw-rw-r-- 1 hadoop hadoop  7208496  4月 14 19:08 dispatch2012_new.csvac-rw-rw-r-- 1 hadoop hadoop  6137045  4月 14 19:08 dispatch2012_new.csvad$ wc -l dispatch2012_new.csv*   60000 dispatch2012_new.csvaa   60000 dispatch2012_new.csvab   60000 dispatch2012_new.csvac   51272 dispatch2012_new.csvad  231272 总用量

压缩和解压

.tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gunzip FileName.gz解压2:gzip -d FileName.gz压缩:gzip FileName.tar.gz 和 .tgz解压:tar zxvf FileName.tar.gz压缩:tar zcvf FileName.tar.gz DirName———————————————.bz2解压1:bzip2 -d FileName.bz2解压2:bunzip2 FileName.bz2压缩: bzip2 -z FileName.tar.bz2解压:tar jxvf FileName.tar.bz2压缩:tar jcvf FileName.tar.bz2 DirName———————————————.bz解压1:bzip2 -d FileName.bz解压2:bunzip2 FileName.bz压缩:未知.tar.bz解压:tar jxvf FileName.tar.bz压缩:未知———————————————.Z解压:uncompress FileName.Z压缩:compress FileName.tar.Z解压:tar Zxvf FileName.tar.Z压缩:tar Zcvf FileName.tar.Z DirName———————————————.zip解压:unzip FileName.zip压缩:zip FileName.zip DirName———————————————.rar解压:rar x FileName.rar压缩:rar a FileName.rar DirName———————————————.lha解压:lha -e FileName.lha压缩:lha -a FileName.lha FileName———————————————.rpm解包:rpm2cpio FileName.rpm | cpio -div———————————————.deb解包:ar p FileName.deb data.tar.gz | tar zxf -———————————————.tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb .slp .arj .rar .ace .lha .lzh .lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea解压:sEx x FileName.*压缩:sEx a FileName.* FileName

5. vi

显示行号: :set number

打开文件定位到最后一行: vi + file.txt
从指定行删除到最后一行

方法1: 使用set number计算当前行和最后一行的差比如100输入100dd

6. Awk/sed

列编辑

replace(replace(DISPATCHMEMO,chr(10),''),chr(9),'')awk '{print "<" $0 "> "}' O_FZ12345_CALLINFO>O_FZ12345_CALLINFO2awk '{print "select count(*) from " $0 " union all \n"}' cl>cl2awk '{print "replace(replace(" $0 ",chr(10),''),chr(9),'')"}' O_FZ12345_CALLINFO>O_FZ12345_CALLINFO2awk '{print "replace(replace(" $0 ",chr(10),''),chr(9),'')"}' c3>c4%s/,)/,'')/alter table owner to etl;awk '{print "alter table " $0 " owner to etl;"}' test>test2

列的最大长度

下面2个语句执行的结果不同??

打印结果时,用双引号
awk '{if (length($NF)>maxlength) maxlength=length($NF)} END {print maxlength" "$1" "$2" "$NF}' fz12345_original.txt

找出最后一列的最大长度  awk '{if (length($NF)>maxlength) maxlength=length($NF)} END {print maxlength }' fz12345_original.txt   找出最大长度的那一条记录  awk 'length($NF)==2016 {print $1" "$2" "$NF}' fz12345_original.txt  最后一列为空  awk '{$NF="" ;print $0}' fz12345_original.txt  | head  截取最后一列:  awk '{print substr($NF, 0, 900)}' fz12345_original.txt  打印一整行:  awk '{print $0}' fz12345_original.txt  打印第一列和最后一列, 最后一列被截取, 以\t分割  awk '{$NF=substr($NF, 0, 900) ;print $1"\t"$NF}' fz12345_original.txt  | head  截取最后一列, 并打印整行. 但是分隔符变成空格. 如果原先内容有空格,则无法正确解析  awk '{$NF=substr($NF, 0, 900) ;print $0}' fz12345_original.txt  | head  截取最后一列, 打印整行, 分隔符为\t  awk 'BEGIN {OFS="\t"}{$NF=substr($NF, 0, 900) ;print $0}' fz12345_original.txt | head  行的字段数不一样. 是因为如果有些字段值为空: 如果是空值,则不会被计算为一列!  awk '{print NF}' fz12345.txt | head  awk '{print NF}' fz12345_original.txt | head  输出字段分隔符:  awk 'BEGIN {OFS="\t"}{$NF=substr($NF, 0, 900) ;print $0}' fz12345_original.txt > fz12345.txt  输入字段分隔符,输出字段分隔符:  awk 'BEGIN {FS="\t";OFS="\t"}{$NF=substr($NF, 0, 900) ;print $0}' fz12345_original.txt > fz12345.txt  输入字段,输入行,输出字段,输出行分隔符:  awk 'BEGIN {FS="\t";RS="\n";OFS="\t";ORS="\n";}{$NF=substr($NF, 0, 900) ;print $0}' fz12345_original.txt > fz12345.txt  awk FS="\t" '{$NF=substr($NF, 0, 900) ;print $0}' OFS="\t" fz12345_original.txt > fz12345.txt  
awk -F:'{print $1,$3,$6}' OFS="\t" /etc/passwd /etc/passwd文件是以:为分隔符的. 取出第1,3,6列. 以\t分割!

一列转多行

hadoop@hadoop:~$ echo 'A|B|C|aa,bb|DD' | awk -F\| 'BEGIN{OFS="|"}{split($4,a,",");for(i in a){$4=a[i];print $0}}'A|B|C|aa|DDA|B|C|bb|DDhadoop@hadoop:~$ echo 'A|B|C|aa|DD' | awk -F\| 'BEGIN{OFS="|"}{split($4,a,",");for(i in a){$4=a[i];print $0}}'A|B|C|aa|DDawk 'BEGIN{FS="\t";OFS="\t"}{split($5,a,",");for(i in a){$5=a[i];print $0}}' \fz12345_dispatch_2014.txt > fz12345_dispatch_2014_2.txt转换前文件:2251562 FZ15032600537   福州市信访局    2015-03-26 16:29:50     福州市城乡建设委员会,福州市交通运输委员会       0       1       10      2015-04-10 16:29:50转换后文件:2251562 FZ15032600537   福州市信访局    2015-03-26 16:29:50     福州市城乡建设委员会    0       1       10      2015-04-10 16:29:502251562 FZ15032600537   福州市信访局    2015-03-26 16:29:50     福州市交通运输委员会    0       1       10      2015-04-10 16:29:50

去掉文件中的所有双引号: sed -i 's/"//g' dispatch2012.csv

将^M删除

sed -i 's/"//g' dispatch2012.csv                        ×tr -d '^M' < dispatch2012_2.csv                     ×alias dos2unix="sed -i -e 's/'\"\$(printf '\015')\"'//g' "      √dos2unix dispatch2012_2.csv                         sed -i -e 's/'\"\$(printf '\015')\"'//g' dispatch2012_2.csv     报错: bash: 未预期的符号 `(' 附近有语法错误

删除第一行: sed -i '1d;$d' dispatch2012_2.csv

第五列因为乱码直接改为空字符串!

awk 'BEGIN {FS=",";RS="\n";OFS="\t";ORS="\n";}{$5="";print $0}' dispatch2012.csv > dispatch2012_2.csv

7.其他

制作程序启动脚本:

arg=$1cmd=''if [ $arg == 'idea' ]; then  cmd='/home/hadoop/tool/idea-IU-139.225.3/bin/idea.sh'fiecho '应用程序启动命令:$cmd'nohup $cmd &

转载地址:http://sqmpx.baihongyu.com/

你可能感兴趣的文章
四则运算
查看>>
Qt5 for Android: incompatible ABI
查看>>
zookeeper学习
查看>>
class类名的管理
查看>>
LeetCode:Rectangle Area
查看>>
文本查询
查看>>
查看帐号授权信息
查看>>
小程序(四):模板
查看>>
【转】Java - printf
查看>>
jquery获取元素到屏幕底的可视距离
查看>>
ENDNOTE使用方法(转发)
查看>>
计算机数制和运算的一点总结.
查看>>
UML系列 (五) 为什么要用UML建模之建模的重要性
查看>>
框架是什么,框架有什么用(转)
查看>>
集成测试
查看>>
[android] 手机卫士黑名单功能(列表展示)
查看>>
c3p0连接池配置
查看>>
对于I/O流中解压中遇到的问题
查看>>
问答项目---用户注册的那些事儿(JS验证)
查看>>
Android进阶篇-百度地图获取地理信息
查看>>