社区电脑网络 → 浏览:帖子主题
分页: 1 2 3, 共 3 页
* 帖子主题: Linux 常用命令大全(非常全面)
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 13 楼 ] 回复
十五、vim专题
①、大小写转换

: vim大小写转换_郭耀今 -- 蓝天白云-CSDN博客_vim大写转小写

②、字符串处理专题

总结:

掐头(删左侧: ①#:删左侧;②##:贪婪删左侧)去尾(删右侧: ①%:删右边;②%%:贪婪删右侧)

1、linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

2、Linux Bash Shell字符串截取

3、Shell 截取字符串

4、shell脚本字符串截取的8种方法

5. Linux-shell脚本字符串截取

6. linux中shell变量$#,$@,$0,$1,$2的含义解释/Shell中的${}、##和%%使用范例/export

7.Shell 命令中的特殊替换、模式匹配替换、字符串提取和替换

8.shell变量里的字符替换

③、vi中文本操作

vi/vim 中在每行行首或行尾插入指定字符串

行首 :%s/^/your_word/
行尾 :%s/$/your_word/

按键操作:

注释(列模式方式):ctrl+v 进入列编辑模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如”#”,再按Esc,就会全部注释了。

删除:先按v,进入visual模式,横向选中列的个数(如”#”注释符号,需要选中两列),再按Esc,再按ctrl+v 进入列编辑模式,向下或向上移动光标,选中注释部分,然后按d, 就会删除注释符号(#)。

PS:当然不一定是shell的注释符”#”,也可以是”//”,或者其他任意的字符;vim才不知道什么是注释符呢,都是字符而已。

案例:

vim 列编辑模式

使用替换命令:

替换命令语法:

:[addr]s/源字符串/目标字符串/[option]

全局替换:

:%s/源字符串/目标字符串/g

参数说明:

    [addr]——表示检索范围,省略时表示当前行。
        "%":表示整个文件,同"1,$";
        ".,$":从当前行到文件尾;
    s:表示替换操作
    [option]:表示操作类型
        g:全局替换
        c:表示进行确认
        p:表示替换结果逐行显示(Ctrl+L恢复屏幕)
        省略option:默认仅对每行第一个匹配串进行替换
    如果在源字符串和目标字符串中有特殊字符,需要使用“\”转义

举例:

在全部内容的行首添加//号注释
:% s/^/\/\//g

在2~50行首添加//号注释
:2,50 s/^/\/\//g

在2~50行首删除//号
:2,50 s/^\/\///g

全局替换(全文替换、全部替换):

:%s/原字符/希望替换的字符/g
————————————————
版权声明:本文为CSDN博主「江畔独步」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liuwei0376/article/details/88245472
2022-11-11 10:51:41 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 14 楼 ] 回复
④、vim基础操作

在命令模式下:

1、填到指定行,如5

:5

2、跳到最后一行

G(shift + g)

3、跳到行首

gg

4、转到第N行,如第7行

7G

5、删除所有内容

A).使用shift+g转到最后一行

B).命令模式下输入:1,.d

引申:深处第3行到最后一行

A).使用shift+g转到最后一行

B).命令模式下输入:3,.d

6、删除光标所在字符

x

7、删除表过所在前的字符(大写X)

X

8、删除到下一个单词开头

dw

9、删除到本单词末尾

de

10、删除到本单词末尾包括标点在内

dE

11、删除到前一个单词

db

12、删除到前一个单词包括标点在内

dB

13、删除一整行

dd

14、删除光标位置到本行结尾

ud$

15、删除光标位置到本行开头

d0

在vim中 ,“.”当前行 ,“1,.”表示从第一行到当前行 ,“d”删除,3dd代表删除三行。

16、vim 统计单词匹配数量

:%s/hello world/&/gn
上句统计hello world 在全文出现的次数

如果要统计从50行到100行,出现的次数,则使用:
:50,100s/hello world//gn

⑤、shell脚本中的注释(单行注释/多行注释)

1、单行注释

"#" 置于行首位置

2、多行注释

A) 方式一

    :<<!
    # 需要注释的内容
    !

B) 方式二

    if false; then
    # 待注释的代码块
    fi

C) 方式三

    ((0)) && {
    # 待注释的代码块
    }
————————————————
版权声明:本文为CSDN博主「江畔独步」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liuwei0376/article/details/88245472
2022-11-11 10:51:56 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 15 楼 ] 回复
十五、字符设置和文件格式转换

dos2unix filedos.txt fileunix.txt 将一个文本文件的格式从MSDOS转换成UNIX
unix2dos fileunix.txt filedos.txt 将一个文本文件的格式从UNIX转换成MSDOS
recode ..HTML < page.txt > page.html 将一个文本文件转换成html
recode -l | more 显示所有允许的转换格式

十六、文件系统分析


badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块
fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性
fsck.ext2 /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性
e2fsck /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性
e2fsck -j /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性
fsck.ext3 /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性
fsck.vfat /dev/hda1 修复/检查hda1磁盘上fat文件系统的完整性
fsck.msdos /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性
dosfsck /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性

十七、初始化一个文件系统


mkfs /dev/hda1 在hda1分区创建一个文件系统
mke2fs /dev/hda1 在hda1分区创建一个linux ext2的文件系统
mke2fs -j /dev/hda1 在hda1分区创建一个linux ext3(日志型)的文件系统
mkfs -t vfat 32 -F /dev/hda1 创建一个 FAT32 文件系统
fdformat -n /dev/fd0 格式化一个软盘
mkswap /dev/hda3 创建一个swap文件系统

十八、SWAP文件系统

mkswap /dev/hda3 创建一个swap文件系统
swapon /dev/hda3 启用一个新的swap文件系统
swapon /dev/hda2 /dev/hdb3 启用两个swap分区

十九、备份

dump -0aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的完整备份
dump -1aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的交互式备份
restore -if /tmp/home0.bak 还原一个交互式备份
rsync -rogpav --delete /home /tmp 同步两边的目录
rsync -rogpav -e ssh --delete /home ip_address:/tmp 通过SSH通道rsync
rsync -az -e ssh --delete ip_addr:/home/public /home/local 通过ssh和压缩将一个远程目录同步到本地目录
rsync -az -e ssh --delete /home/local ip_addr:/home/public 通过ssh和压缩将本地目录同步到远程目录
dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' 通过ssh在远程主机上执行一次备份本地磁盘的操作
dd if=/dev/sda of=/tmp/file1 备份磁盘内容到一个文件
tar -Puf backup.tar /home/user 执行一次对 '/home/user' 目录的交互式备份操作
( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' 通过ssh在远程目录中复制一个目录内容
( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' 通过ssh在远程目录中复制一个本地目录
tar cf - . | (cd /tmp/backup ; tar xf - ) 本地将一个目录复制到另一个地方,保留原有权限及链接
find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 从一个目录查找并复制所有以 '.txt' 结尾的文件到另一个目录
find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 查找所有以 '.log' 结尾的文件并做成一个bzip包
dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一个将 MBR (Master Boot Record)内容复制到软盘的动作
dd if=/dev/fd0 of=/dev/hda bs=512 count=1 从已经保存到软盘的备份中恢复MBR内容
————————————————
版权声明:本文为CSDN博主「江畔独步」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liuwei0376/article/details/88245472
2022-11-11 10:52:09 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 16 楼 ] 回复
二十、光盘操作

cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一个可复写的光盘内容
mkisofs /dev/cdrom > cd.iso 在磁盘上创建一个光盘的iso镜像文件
mkisofs /dev/cdrom | gzip > cd_iso.gz 在磁盘上创建一个压缩了的光盘iso镜像文件
mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cd 创建一个目录的iso镜像文件
cdrecord -v dev=/dev/cdrom cd.iso 刻录一个ISO镜像文件
gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom - 刻录一个压缩了的ISO镜像文件
mount -o loop cd.iso /mnt/iso 挂载一个ISO镜像文件
cd-paranoia -B 从一个CD光盘转录音轨到 wav 文件中
cd-paranoia -- "-3" 从一个CD光盘转录音轨到 wav 文件中(参数-3)
cdrecord --scanbus 扫描总线以识别scsi通道
dd if=/dev/hdc | md5sum 校验一个设备的md5sum编码,例如一张 CD

二一、网络 - (以太网和WIFI无线)


ifconfig eth0 显示一个以太网卡的配置
ifup eth0 启用一个 'eth0' 网络设备
ifdown eth0 禁用一个 'eth0' 网络设备
ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址
ifconfig eth0 promisc 设置 'eth0' 成混杂模式以嗅探数据包 (sniffing)
dhclient eth0 以dhcp模式启用 'eth0'
route -n show routing table
route add -net 0/0 gw IP_Gateway configura default gateway
route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 configure static route to reach network '192.168.0.0/16'
route del 0/0 gw IP_gateway remove static route
echo "1" > /proc/sys/net/ipv4/ip_forward activate ip routing
hostname show hostname of system
host www.example.com lookup hostname to resolve name to ip address and viceversa(1)
nslookup www.example.com lookup hostname to resolve name to ip address and viceversa(2)
ip link show show link status of all interfaces
mii-tool eth0 show link status of 'eth0'
ethtool eth0 show statistics of network card 'eth0'
netstat -tup show all active network connections and their PID
netstat -tupl show all network services listening on the system and their PID
tcpdump tcp port 80 show all HTTP traffic
iwlist scan show wireless networks
iwconfig eth1 show configuration of a wireless network card
hostname show hostname
host www.example.com lookup hostname to resolve name to ip address and viceversa
nslookup www.example.com lookup hostname to resolve name to ip address and viceversa
whois www.example.com lookup on Whois database

二二、JPS工具

jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。

    我想很多人都是用过unix系统里的ps命令,这个命令主要是用来显示当前系统的进程情况,有哪些进程,及其 id。 jps 也是一样,它的作用是显示当前系统的java进程情况,及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),和他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。

    使用方法:在当前命令行下打 jps(需要JAVA_HOME,没有的话,到改程序的目录下打) 。

jps存放在JAVA_HOME/bin/jps,使用时为了方便请将JAVA_HOME/bin/加入到Path.

$> jps
23991 Jps
23789 BossMain
23651 Resin


比较常用的参数:

-q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
$>  jps -q
28680
23789
23651

-m 输出传递给main 方法的参数,在嵌入式jvm上可能是null

$> jps -m
28715 Jps -m
23789 BossMain
23651 Resin -socketwait 32768 -stdout /data/aoxj/resin/log/stdout.log -stderr /data/aoxj/resin/log/stderr.log

-l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名

$> jps -l
28729 sun.tools.jps.Jps
23789 com.asiainfo.aimc.bossbi.BossMain
23651 com.caucho.server.resin.Resin

-v 输出传递给JVM的参数

$> jps -v
23789 BossMain
28802 Jps -Denv.class.path=/data/aoxj/bossbi/twsecurity/java/trustwork140.jar:/data/aoxj/bossbi/twsecurity/java/:/data/aoxj/bossbi/twsecurity/java/twcmcc.jar:/data/aoxj/jdk15/lib/rt.jar:/data/aoxj/jd

k15/lib/tools.jar -Dapplication.home=/data/aoxj/jdk15 -Xms8m
23651 Resin -Xss1m -Dresin.home=/data/aoxj/resin -Dserver.root=/data/aoxj/resin -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -

Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl

sudo jps看到的进程数量最全

jps 192.168.0.77

列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099

(前提是远程服务器提供jstatd服务)

注:jps命令有个地方很不好,似乎只能显示当前用户的java进程,要显示其他用户的还是只能用unix/linux的ps命令。
————————————————
版权声明:本文为CSDN博主「江畔独步」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liuwei0376/article/details/88245472
2022-11-11 10:52:32 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 17 楼 ] 回复
详细情况请参考sun官方文档。
http://java.sun.com/j2se/1.7.0/docs/tooldocs/share/jps.html

GO TOP INDEX ^
Microsoft Windows networks (SAMBA)
nbtscan ip_addr netbios name resolution
nmblookup -A ip_addr netbios name resolution
smbclient -L ip_addr/hostname show remote shares of a windows host
smbget -Rr smb://ip_addr/share like wget can download files from a host windows via smb
mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share mount a windows network share

-b file            若文件存在且是一个块特殊文件,则为真
-c file            若文件存在且是一个字符特殊文件,则为真
-d file            若文件存在且是一个目录,则为真
-e file            若文件存在,则为真
-f file            若文件存在且是一个规则文件,则为真
-g file            若文件存在且设置了SGID位的值,则为真
-h file            若文件存在且为一个符合链接,则为真
-k file            若文件存在且设置了"sticky"位的值
-p file            若文件存在且为一已命名管道,则为真
-r file            若文件存在且可读,则为真
-s file            若文件存在且其大小大于零,则为真
-u file            若文件存在且设置了SUID位,则为真
-w file            若文件存在且可写,则为真
-x file            若文件存在且可执行,则为真
-o file            若文件存在且被有效用户ID所拥有,则为真

-z string          若string长度为0,则为真
-n string          若string长度不为0,则为真
string1 = string2  若两个字符串相等,则为真
string1 != string2 若两个字符串不相等,则为真

int1 -eq int2      若int1等于int2,则为真
int1 -ne int2      若int1不等于int2,则为真
int1 -lt int2      若int1小于int2,则为真
int1 -le int2      若int1小于等于int2,则为真
int1 -gt int2      若int1大于int2,则为真
int1 -ge int2      若int1大于等于int2,则为真

!expr              若expr为假则复合表达式为真。expr可以是任何有效的测试表达式
expr1 -a expr2    若expr1和expr2都为真则整式为真
expr1 -o expr2    若expr1和expr2有一个为真则整式为真

特殊变量

$0                正在被执行命令的名字。对于shell脚本而言,这是被激活命令的路径
$n                该变量与脚本被激活时所带的参数相对应。n是正整数,与参数位置相对应($1,$2…)
$#                提供脚本的参数号
$*                所有这些参数都被双引号引住。若一个脚本接收两个参数,$*等于$1$2
$@                所有这些参数都分别被双引号引住。若一个脚本接收到两个参数,$@等价于$1$2
$?                前一个命令执行后的退出状态, 常用于判断上一个命令的执行结果, 以辅助判断下游分支逻辑的执行
$$                当前shell的进程号。对于shell脚本,这是其正在执行时的进程ID
$!                前一个后台命令的进程号

二三、crontab调度器
①、语法

Linux下的任务调度分为两类:系统任务调度和用户任务调度。Linux系统任务是由 cron (crond) 这个系统服务来控制的,这个系统服务是默认启动的。用户自己设置的计划任务则使用crontab 命令。在CentOS系统中:

    cat /etc/crontab
   
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    HOME=/
    # 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
   
    前四行是用来配置crond任务运行的环境变量:
    》第一行SHELL变量指定了系统要使用哪个shell,这里是bash;
    》第二行PATH变量指定了系统执行命令的路径;
    》第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户;
    》第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
   
    用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

2022-11-11 10:52:54 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 18 楼 ] 回复
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段:
》前五段是时间设定段;
》第六段是要执行的命令段

crontab表达式 格式如下:
minute hour day month week command

crontab用法与实例crontab用法与实例

在以上各个字段中,还可以使用以下特殊字符:

    "*"代表所有的取值范围内的数字,如月份字段为*,则表示1到12个月;
    "/"代表每一定时间间隔的意思,如分钟字段为*/10,表示每10分钟执行1次。
    "-"代表从某个区间范围,是闭区间。如“2-5”表示“2,3,4,5”,小时字段中0-23/2表示在0~23点范围内每2个小时执行一次。
    ","分散的数字(不一定连续),如1,2,3,4,7,9。
    注:由于各个地方每周第一天不一样,因此Sunday=0(第一天)或Sunday=7(最后1天)。

case: 每隔2分钟,删除指定目录下,创建时间超过10个小时的文件

*/2 * * * * /bin/sh -c "find /tmp/hadoop-hdfs/mapred/local -cmin +600 -type d -exec rm -rf {} \;" >> /var/lib/hadoop-hdfs/auto_remove_mr_output.out

二四、Shell编程相关

①、内置变量

1、declare

declare声明变量的使用,总结如下:
declare [+/-][选项] 变量名
选项:
  -:给变量添加类型属性
  +:取消变量的类型属性
  -a:将变量声明为数组型,-A将声明一个关联数组,俗称字典。  关联知识:Shell 数组与关联数组详解及实例代码(https://www.jb51.net/article/103915.htm)
  -i:将变量声明为整型
  -x:将变量声明为环境变量
  -r:将变量声明为只读变量
  -p:查看变量的被声明的类型

declare -i 说明:

和 (())、let、$[] 不同,declare -i的功能非常有限,仅支持最基本的数学运算(加减乘除和取余),不支持逻辑运算(比较运算、与运算、或运算、非运算),所以在实际开发中很少使用。

    declare -i m n ret
    m=10
    n=30
   
    ret=$m+$n
    echo $ret
   
    ret=$n/$m
    echo $ret

declare的作用域,只在函数内,出来后就失效了,如下:

    #!/bin/bash
   
    foo()
    {
    declare FOO="bar"
    }
   
    bar()
    {
    foo
    echo $FOO
    }
   
    bar



2022-11-11 10:53:12 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 19 楼 ] 回复
②、数据结构

1、数组

Linux shell中数组的使用

数组有两种数据类型:

A). 一是数值类型;

B). 二是字符串类型.

虽然shell本身是弱类型的,但也可以这么区分。

数值类型的数组:一对括号表示数组,数组中元素之间使用“空格”来隔开。

  举个列子:

  arr_number=(1 2 3 4 5);

字符串类型数组:同样,使用一对括号表示数组,其中数组中的元素使用双引号或者单引号包含,同样使用“空格”来隔开。

  arr_string=("abc" "edf" "sss"); 或者 arr_string=('abc' 'edf' 'sss');

    #!/bin/bash
    arr_number=(1 2 3 4 5)
   
    # ①、获取数组长度
    # 语法: ${#ARRAY_NAME[@|*]}
    echo 'arr_number length ='${#arr_number[@]}
    echo 'arr_number length ='${#arr_number[*]}
   
    # ②、根据下标访问数组元素(注意:下标与java语法类似,从0开始)
    # 2nd key's value
    echo "2nd key's value ="${arr_number[1]}
   
    # ③、分片访问
    echo ${arr_number[@]:0:6}
   
    # ④、模式替换
    echo ${arr_number[@]/3/33}
   
    # ⑤、数组的遍历
    for e in ${arr_number[@]}
    do
            echo $e
    done
   
    # ⑥、综合案例
    # 编注:数组默认分割符为空格,如果数组元素中本身包含空格,也会被截断,这里通过改变IFS(系统字段分割# 符默认为空格)为换行,达到分割数组的目的。
    greet=('hello world' "hi,john")
    OLD_IFS=$IFS
    IFS='\n'
    for e in ${greet[@]}
    do
            echo $e
    done
    IFS=$OLD_IFS

》①、批量删除日志:

for i in in {1..10}; do rm -f hadoop-cmf-hive-HIVEMETASTORE-nn1.testhdp.com.log.out.$i;done

》②、批量将日志置空:

for i in in {1..10}; do cat /dev/null > hadoop-cmf-yarn-NODEMANAGER-dn8.hadoop.com.log.out.$i;done

2022-11-11 10:53:30 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 20 楼 ] 回复
2、字典dict 或 Map

1). 声明字典类型:
declare -A dic

这里一定要-A来声明,-a只能用来声明数组类型。

2). 字典赋初值
dic=([key1]="value1" [key2]="value2" [key3]="value3")

3). 字典动态赋值
dic['key']=value

4). 打印指定key的value
echo ${dic['key']}

5). 打印所有key值
echo ${!dic[*]}

6). 打印所有value
echo ${dic[*]}

7). 遍历key值
for key in $(echo ${!dic[*]})
do
    echo "$key : ${dic[$key]}"
done
8). 综合案例

    #! /bin/sh
    #输入格式为一行一个单词
   
    declare -A dict
    dict=([k1]="v1" [k2]="v2")
    echo ${dict["k1"]}
    echo ${!dict[*]}
    echo ${dict[*]}
   
    for key in ${!dict[*]}
    do
            echo "$key : ${dict[$key]}"
    done
    set -x
    aa="null"
    bb=
    cc=''
   
    #    -z 字符串为"null".就是长度为0.
    #
    #    -n 字符串不为"null"
    #
    #    注意:
    #
    #    使用-n在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z
    #
    #    或者就是未用""引用的字符串本身,放到[]结构中。虽然一般情况下可
    #
    #    以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯.
    if [ -n "$cc" ];then
            echo "aa is not null"
    fi
    set +x
   
   
    #定义字典类型变量
    declare -A dict
   
    #从标准输入读取
    while read word
    do
        #若key为word的变量不存在,则为未定义,即第一次遇到此word,则将此word加入字典并设置其value为1。,否则自增value值
        if [ ! -n dict[${word}] ];then
            dict[${word}]=1
        else
            ((dict[${word}]++))
        fi
    done
    #打印统计结果
    echo -e "word\t\tcount"
    for key in $(echo ${!dict[*]})
    do
        echo -e "$key\t\t${dict[$key]}"
    done

综合案例二: shell的map简单的添加、查找、删除、遍历

3、管道输出中执行下一条指令

    ps -ef | grep 'new-consumer' | awk '{print $2}' |xargs kill -9      #删除kafka consumer进程
   
    ps -ef|grep java|grep -v grep|awk '{print $2}'|xargs kill -9          #删除java进程 
   
    find /opt/flume-custom/ -name *.conf|xargs grep -re "127.0.0.1:9092" #查找到的文件中查找指定字符串
   
    find /opt/ -type f -name '*.log' |xargs grep 'db.hostname'
   
    cat ~/.ssh/id_rsa.pub | ssh my_admin@111.111.111.111 "cat - >> ~/.ssh/authorized_keys"
   
    kill -9 $(ps -ef|grep "sh\ *start_new.sh\ *main"|grep -v grep|awk '{print $2}') #\ *表任意多空格
   
    kill -9 `ps -ef|grep data-integration|awk '{print $2}'`
   
    ls|while read f;do zip -r ${f}.zip $f;done  #压缩所有ls出来的文件夹
   
    ls|grep 'hadoop-cmf-yarn-RESOURCEMANAGER-nn1.hadoop.com.log.out.[0-9]\{1,\}'|while read f;do cat /dev/null > $f;done #将所有RESOURCEMANAGER日志文件内容置为空,文件尾缀为1个以上从0到9的数字,如1、2、9、12均能匹配查找到,在nn1上磁盘(/var/log/{hadoop-hdfs,hadoop-yarn})上日志一般都比较大
   
    # 查找10日前创建的文件,并情况其内容
    find . -type f -name '*oozie-instrumentation.log.*' -atime +10 | while read f;do cat /dev/null > $f;done
   
    #查看所有用户的crontab任务,其中"-I {}"参数,可以使用-i来等量实现
    cat /etc/passwd | cut -f 1 -d : |xargs -I {} crontab -l -u {}
    cat /etc/passwd | cut -f 1 -d : |xargs -i crontab -l -u {}
   
    # 查询当前目录下所有文件(含目录下文件)中包含关键字(sku)的文件路径, 滤重, 并过滤掉路径中含指定字符(000)
    grep -rn 'sku' * | awk -F ':' '{print $1}' | uniq | grep -v 000

传送门:Shell基础知识》xargs详解
2022-11-11 10:53:48 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 21 楼 ] 回复
读取文件每一行,并循环做处理:

①、while read line
do
      …
done < file

②、cat file  | ${BIZ_LOGICAL}

综合实例:

    ssh  127.0.0.1 <<EOF
    sudo su
    sed -i 's/^Hostname=.*/Hostname=127.0.0.1/' /etc/zabbix/zabbix_agentd.conf
    cat /etc/zabbix/zabbix_agentd.conf | grep Hostname
    ps -ef | grep zabbix | awk  '{print \$2}' | xargs kill -9
    /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
    sleep 2
    ps -ef  | grep zabbix
    exit
    exit
    EOF

4、循环、迭代逻辑控制

4.1 while循环语法(while...do...done)

    #hdfs文件统计
   
    hdfs dfs -ls /  | hdfs dfs -ls `awk '{print $8}'`/ |  echo -e "`awk '{print $8}'`/ \n"  | while read line ; do echo -e "$line \t\t\t\t\t `sudo -u hdfs hdfs dfs -ls -R $line | wc -l `"    ;done
   
    hdfs dfs -ls /  | hdfs dfs -ls `awk '{print $8}'`/ |  awk '{ cmd="echo -e  "$8"\\\t\\\t\\\t\\\t`sudo -u hdfs  hdfs dfs -ls -R  "$8"| wc -l`" ;cmd|getline ; print $0}'
   
    #jar包里统计包含指定字符的文件名
   
    ls;while read line;do cat /dev/null>$line; done
   
    ls lib/* |while read line;do jar -tf $line|grep LogAnalysis; echo $line;done
   
    #hdfs文件大小统计排序
   
    hdfs dfs -du ${HDFS_PATH} | sort -rn | head -n 10 | awk '{printf("%.2f\t\t%.2f\t\t%s\t\n",$1/1024/1024/1024,"\t"$2/1024/1024/1024,"\t"$3)}'
   
    #获取所有java程序的进程号
   
    ps -ef | while read line ; do if [[ $line =~ "java" ]] ;then echo $line |  awk -F ' ' '{print $2}' ; fi ;done
   
    //循环所有文件,并添加header
    #!/bin/bash
    ls OrderDetail_sysdate_* |while read file;do
    sed -i "1i\\$(cat header.csv)" $file
    done
   

综合案例:

清理日志文件夹中的日志文件,将其置为黑洞文件内容(即情况该文件)。

    #!/bin/bash
   
    #先遍历本文件夹里文件夹
    dir_list=`ls`
   
    #对查询到的文件夹执行清空其内文件的操作
    for dir in $dir_list;do
        echo $dir
        ls $dir/* | while read line;do echo $line; cat /dev/null > $line; done
    done

for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/dev/null & done

pkill -9 dd

2022-11-11 10:54:04 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 22 楼 ] 回复
5、break 与 contine区别

如下代码所示:
不带参数 N:   
break    循环只能退出最内层的循环;
continue    只能去掉本次循环的剩余代码;

带参数 N:   
break N    可以退出N层循环;
continue N    将会把N层循环剩余代码都去掉,单循环次数不变;

    #!/bin/bash
   
    for i in a b c d
    do
        echo -n $i
   
        for j in `seq 10`
        do
            if test $j -eq 5;then
                #break
              # continue
                #break 2
                continue 2
            fi
            echo -n $j
        done
   
        #换行
        echo
    done
   
    ##########################################
    ###
    ### Program result:
    ###
    ##########################################
    #
    #>>>>>>>>>>>>>> 1. break >>>>>>>>>>>>>>>>>
    # a1234
    # b1234
    # c1234
    # d1234
   
    #>>>>>>>>>>>>>> 2. continue >>>>>>>>>>>>>>>>>
    # a1234678910
    # b1234678910
    # c1234678910
    # d1234678910
   
    #>>>>>>>>>>>>>> 3. "break 2","break 3" has same effect >>>>>>>>>>>>>>>>>
    # a1234
   
    #>>>>>>>>>>>>>> 4. "continue 2" >>>>>>>>>>>>>>>>>
    # a1234
    # b1234
    # c1234
    # d1234

6、大文件拆分处理

文件拆分:

split -d -a 8 -l 10000 PayOrderDetail.csv PayOrderDetail_sysdate_.csv

    用法:

    Usage: split [OPTION]... [INPUT [PREFIX]]
    Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default
    size is 1000 lines, and default PREFIX is 'x'.  With no INPUT, or when INPUT
    is -, read standard input.

    Mandatory arguments to long options are mandatory for short options too.
      -a, --suffix-length=N  generate suffixes of length N (default 2)
          --additional-suffix=SUFFIX  append an additional SUFFIX to file names
      -b, --bytes=SIZE        put SIZE bytes per output file
      -C, --line-bytes=SIZE  put at most SIZE bytes of lines per output file
      -d, --numeric-suffixes[=FROM]  use numeric suffixes instead of alphabetic;
                                      FROM changes the start value (default 0)
      -e, --elide-empty-files  do not generate empty output files with '-n'
          --filter=COMMAND    write to shell COMMAND; file name is $FILE
      -l, --lines=NUMBER      put NUMBER lines per output file
      -n, --number=CHUNKS    generate CHUNKS output files; see explanation below
      -u, --unbuffered        immediately copy input to output with '-n r/...'
          --verbose          print a diagnostic just before each
                                output file is opened
          --help    display this help and exit
          --version  output version information and exit

    SIZE is an integer and optional unit (example: 10M is 10*1024*1024).  Units
    are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, ... (powers of 1000).

    CHUNKS may be:
    N      split into N files based on size of input
    K/N    output Kth of N to stdout
    l/N    split into N files without splitting lines
    l/K/N  output Kth of N to stdout without splitting lines
    r/N    like 'l' but use round robin distribution
    r/K/N  likewise but only output Kth of N to stdout

    GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
    For complete documentation, run: info coreutils 'split invocation'

详细案例,详见:split命令_Linux split命令:切割(拆分)文件

2022-11-11 10:54:22 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 23 楼 ] 回复
7、awk

#批量删除hdfs下ods层下所有数据

hdfs dfs -lsr /user/hive/warehouse/ods|awk '{print "hdfs dfs -rm -R" $8}'

8、实现脚本中切换用户并执行该用户相关的命令操作

假如当前用户为root账户,希望切换到其他用户下执行相关的操作,如有以下业务场景:

想以yarn用户身份,取删除yarn运行相关的早期用处不大的日志。

方式①、

    #!/bin/bash
    su - yarn <<EOF
        pwd;
        exit;
    EOF

方式②、

su - ${USER} -c ${COMMAND} > /dev/null 2>&1 &

注意:

该命令的执行权限是临时的,只在本条语句起作用。即在COMMAND命令行内部,是以$USER身份执行命令;执行结束后,回到初始状态用户,这里为root。

案例:

    ## 01-Handle logic of clean HDFS NAMENODE & DATANODE & audit logs.
    ########################################################
    su - hdfs -c '
            HDFS_PATH=/var/log/hadoop-hdfs;
            ls $HDFS_PATH | grep "hadoop-cmf-hdfs-NAMENODE-nn1.hadoop.com.log.out.[0-9]\{1,\}$" | while read f;    do `cat /dev/null > $HDFS_PATH/$f`; done  ;
            ls $HDFS_PATH | grep "hadoop-cmf-hdfs-DATANODE-nn1.hadoop.com.log.out.[0-9]\{1,\}$" | while read f;    do `cat /dev/null > $HDFS_PATH/$f`; done  ;
            ls $HDFS_PATH | grep "hdfs-audit.log.[0-9]\{1,\}$" | while read f;                                      do `cat /dev/null > $HDFS_PATH/$f`; done
    '

注意:

① ls这段语句在命令行下执行没任何问题,提取到“su - hdfs -c”中时,`cat /dev/null > $HDFS_PATH/$f`这段必须要包裹上``符号,才能正常执行。

② -c 参数中,可以执行多行命令,但是需要几个条件:A). 所用命令使用''包裹,每一行命令间,使用";"来进行分隔。

补充su的用法:

    [root@cdh-nn1 ~]# su --help
   
    Usage:
    su [options] [-] [USER [arg]...]
   
    Change the effective user id and group id to that of USER.
    A mere - implies -l.  If USER not given, assume root.
   
    Options:
    -m, -p, --preserve-environment  do not reset environment variables
    -g, --group <group>            specify the primary group
    -G, --supp-group <group>        specify a supplemental group
   
    -, -l, --login                  make the shell a login shell
    -c, --command <command>        pass a single command to the shell with -c
    --session-command <command>    pass a single command to the shell with -c
                                    and do not create a new session
    -f, --fast                      pass -f to the shell (for csh or tcsh)
    -s, --shell <shell>            run shell if /etc/shells allows it
   
    -h, --help    display this help and exit
    -V, --version  output version information and exit
   
    For more details see su(1).

su 和 “su - ${USER}”的区别:

    ①、su只是切换用户。
    ②、su - 切换用户并切换shell环境。

    ③、su another
    pwd后为/home/current

    ④、su - another
    pwd后为/home/another

2022-11-11 10:54:39 IP:已设置保密
pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 24 楼 ] 回复
9、awk实现查找奇数行、偶数行:

seq 20 > test.txt
[root@server1 tmp]# awk 'NR%2 != 0' test.txt
[root@server1 tmp]# awk 'NR%2 == 0' test.txt

10、IFS专题

IFS, 全称 内部字段分隔符(Internal Field Separator, IFS) , 作用是在Linux中定义一个定界符,默认是空格。

如果字符串中的分隔符,默认不是空格,而是逗号(如csv文件), 则可以考虑临时替换IFS为逗号,处理完文本处理任务后, 再将默认的修改回来.

如果脚本实现, 按","提取表名list:

batch_upsert_table_process.sh

    #!/bin/bash
   
    include_tables="activity_info,activity_rule,activity_sku,base_category1,base_category2,base_category3,base_province,base_region,base_trademark,coupon_info,coupon_range,coupon_use,financial_sku_cost,sku_info,spu_info,user_info"
   
    function get_element_by_split_comma(){
        ifs_old=$IFS
        IFS=","
   
        for tbl in $(echo "${include_tables}");do
            echo 'Now is handle table >>>>>>>>>>>>>>>>>>>>> '$tbl
            /data/maxwell/bin/maxwell-bootstrap --database gmall --table $tbl --config /data/maxwell/tf_custom_config/gmall_rtdw_test.properties
        done
   
        #Recovery IFS to default
        IFS=$ifs_old
    }
   
    get_element_by_split_comma

③、echo在shell中控制颜色&闪烁显示

1、在shell中显示色彩

语法格式:

echo -e "\033[颜色1:颜色2m 要展示的文字 \033[0m"

参数说明:

-----------------------------------------------------------------------------------------------------------------------

-e选项:表示允许反斜杠(对字符)转义。
\033[颜色1;颜色2m:称为转义序列,它本身是一个整体,中间不要有空格。
\033[:转义序列的开始。其中\033代表Esc符号,也可以使用\E或\e来代替。
颜色1和颜色2:表示字体的前景色或背景色,至于颜色1和颜色2哪一个表示前景色,哪一个表示背景色,由其设定的数值来决定,前景色和背景色的数值空间是不同的。
m:转义序列的终止标志。
\033[0m:表示将颜色恢复回原来的配色。
我们可以用一张原理图来理解:

-----------------------------------------------------------------------------------------------------------------------

图示说明:

颜色码:

2022-11-11 10:54:57 IP:已设置保密
分页: 1 2 3, 共 3 页
快速回复主题
账号/密码
用户: 没有注册?密码:
评论内容