linux知识、shell技巧积累

目录

linux下的文件介绍

/dev/

tty、pts、pty

/proc/

通过服务端设备往指定的客户端输出内容

linux环境相关

执行shell时报错Syntax error: “(“ unexpected (expecting “}“)

设置环境变量是对所有用户生效

普通用户ls没有颜色

调整内核打印信息等级

syslogd/rsyslogd

shell技巧

sed

 sed -i '1i\111111' file

sed 批量修改文件内容

利用sed提取字符串

awk

awk 'END {print gsub("\r", "")}'

find . -name *.cpp | xargs grep -L "-Ddebug"

ls ./ | grep -v mac | xargs rm -rf

遍历目录 for xx in xx

||操作

nohup

pstree 

ifconfig eth0 promisc(或ioctl配置IFF_PROMISC)

dmesg | grep 0x2: | awk '{split($5, arr, ":"); print arr[2]}'

递归显示当前目录下的所有普通文件

fuser -mk  /mnt/mtd

使用source 命令 在脚本中使用另一个脚本的参数定义

将多个静态库整合成一个动态库

四则运算

加法

网卡模式配置

nm命令

id -u

17、EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell 

读取终端输入,根据case执行不同分之

​编辑

挂载临时文件系统并指定大小

Debug

ldd

在匹配行后面输出指定数量的行


linux下的文件介绍

/dev/

tty、pts、pty

虚拟终端(/dev/pts/n):在Xwindows模式下的伪终端

串行端口终端(/dev/ttySn):串行端口终端(Serial Port Terminal): 使用计算机串行端口连接的终端设备         设备名称是/dev/tts/0 (或 /dev/ttyS0) , /dev/tts/1 ( 或 /dev/ttyS1 )等,设备号分别是(4,0), (4,1)等,分别对应于DOS系统下的COM1、 COM2等

伪终端(/dev/pty/):  伪终端(Pseudo Terminal): 成对的逻辑终端设备 (即master和slave设备, 对master的操作会反映到slave上)      如: /dev/ptyp3和 /dev/ttyp3 ( 或者 在设备文件系统中分别是 /dev/pty/m3 和 /dev/pty/s3 )       ptyp3(master设备), ttyp3(slave设备)

控制终端(/dev/tty): 如 当前进程有控制终端(Controlling Terminal)的话,那 /dev/tty 就是当前进程的控制终端的设备特殊文件。      把虚拟机切换到字符界面下,看到的就是tty1/tty2.....

(6条消息) 终端和控制台 串口 console tty pty /dev目录下终端文件 pts/ptmx 伪终端 控制终端 虚拟终端_cpuCode的博客-CSDN博客
(6条消息) Linux 伪终端(pty)_程序员面试吧的博客-CSDN博客_linux伪终端
 

(6条消息) Linux中的tty、pts、pty等概念辨析_Adenialzz的博客-CSDN博客_pty

/proc/

获取UUID

 cat /proc/sys/kernel/random/uuid  或者  uuidgen

通过服务端设备往指定的客户端输出内容

当我们使用ssh登录服务端时ls /ev/pts都会有新的/dev/pts/[n]设备文件产生。我们可以以此进行交互。

输入指令

可以看到,客户端就会打印出来

 

linux环境相关

执行shell时报错Syntax error: “(“ unexpected (expecting “}“)

 硬盘损坏重装了系统,在执行之前的脚本时出现报错

Syntax error: "(" unexpected (expecting "}")

问题排查:

ls -l /bin/sh

默认链接的是 dash

知识补充

bash:为GNU计划编写的Unix shell

sh:相当于 /bin/bash --posix。是开启了POSIX标准的bash

dash:相比bash有更快的执行速度,但是支持的语句叶更少

解决方案

这里我对脚本执行的速度没有要求,只要求能用,所以 改成bash即可

cd /bin/; ln -sf bash /bin/sh

l

 问题解决。

设置环境变量是对所有用户生效

1)当用户登录系统后,首先加载/etc/profile全局环境变量(这也是linux默认的shell主环境变量,每个用户登录都会加载这个文件)

2)接着加载/etc/profile.d/目录下的脚本文件,自动定义开机启动的脚本可以放在这个目录下

3)紧接着加载$HOME/.bash_profile(这是用户个人的环境变量文件)

4)在$HOME/.bash_profile文件中,会加载$HOME/.bashrc(也是用户个人的环境变量文件,包含在$HOME/.bash_profile中),如果有环境变量就加载,如果没有就不加载

5)在$HOME/.bashrc文件中,又会加载/etc/bashrc(这是全局环境变量),同理,有环境变量就加载,没有就不加载

普通用户ls没有颜色

使用root登录,vim /etc/profile

添加alias ls="ls --color"即可

调整内核打印信息等级

Linux内核printk(level,message)函数打印:

其中level是定义的打印优先级,当优先级小于console_loglevel时定义的优先级小于当前日志的打印级别时,信息才会打印在控制终端(根据要打印信息的类型,分为0~7,其中0位最高级别),通常宏来指示日志优先级

#define KERN_EMERG      "<0>"    /* system is unusable */
#define KERN_ALERT      "<1>"    /* action must be taken immediately */
#define KERN_CRIT       "<2>"    /* critical conditions */
#define KERN_ERR        "<3>"    /* error conditions */
#define KERN_WARNING    "<4>"    /* warning conditions */
#define KERN_NOTICE     "<5>"    /* normal but significant */
#define KERN_INFO       "<6>"    /* informational */

#define KERN_DEBUG      "<7>"    /* debug-level messages */

其中console_loglevel的初始值是DEFAULT_CONSOLE_LOGLEVEL,可以通过sys_syslog()系统调用进行修改,或者修改文件/proc/sys/kernel/printk下的优先级,,这个文件中包含了4个整数值,分别是当前日志优先级,未明确指定的日志级别时的默认日志优先级,最小允许的日志优先级,引导时的默认日志优先级。向该文件中写入一个整数值,就会把当前日志文件的优先级修改为该值,修改方式为

echo 4 > /proc/sys/kernel/printk(linux内核2.6日志默认的优先级是4)

message是我们要打印出调试的信息

syslogd/rsyslogd

syslogd是Linux下的一个记录日志文件服务。新版本叫做rsyslogd。

syslogd -O /log/messages -l7 -b5

-O 指定日志输出目录

-l7 记录的日志等级

-b5 保留的个数:

shell技巧

sed

 sed -i '1i\111111' file

在文件指定行添加内容

sed 批量修改文件内容

以下实现是目录下有很多SN开头的.ini文件,找到所有符合要求的文件,找到其中包含的ProductModel行,将其等号后面的内容后追加-13

#!/bin/bash

PRODUCT_NAME=
NEW_STRING=

_THREAD_PATH=$PWD

for Thread in `find $_THREAD_PATH -iname SN*.ini`;do
	#echo -e "FileName[$Thread]"
	echo -e "\n\n FileName[$Thread],  [$PRODUCT_NAME] -- [$NEW_STRING] -- CMD[sed -i "s/$PRODUCT_NAME/$NEW_STRING/g" ./$Thread]"
	
	PRODUCT_NAME=`cat $Thread | grep "ProductModel" | sed 's/.*=//'`   #提取字符串 找到ProductModel = SN-IPR7150BYAN-B2.8  输出SN-IPR7150BYAN-B2.8
	NEW_STRING="$PRODUCT_NAME""-13"
	sed -i "s/$PRODUCT_NAME/$NEW_STRING/g" $Thread  #在SN-IPR7150BYAN-B2.8追加-13
	
done

利用sed提取字符串

cat /proc/cmdline | sed 's/.*sz=//'

将包含sz=在内的左边的所有内容删除

 awk sed 命令 (shuzhiduo.com)

awk

awk 'END {print gsub("\r", "")}'

RET=`awk 'END {print gsub("\r", "")}' ./debug.ini`
if [ $RET -ge 1 ];then
	sed -i 's/\r//' ./debug.ini
fi

用于检测一个文件中的回车符。

  1. awk 'END {print gsub("\r", "")}' ./debug.ini

    • awk 是一个文本处理工具,常用于模式扫描和文本/数据提取。
    • 'END {print gsub("\r", "")}' 是 awk 的一个脚本,其中 END 表示在处理完所有行之后执行这个动作。
    • gsub("\r", "") 是一个全局替换函数,它会查找所有的 \r(回车符)并将其删除。
    • ./debug.ini 是要处理的文件路径。
    • 这个命令的目的是计算并返回文件中回车符的数量。
  2. RET=awk ...``:

    • 这部分将上面的 awk 命令的输出(即回车符的数量)赋值给变量 RET
  3. if [ $RET -ge 1 ];then

    • 这是一个条件语句,检查变量 RET(回车符的数量)是否大于等于1。
  4. echo "dos"

    • 如果上面的条件为真(即回车符的数量大于1),则输出 "dos"。

简而言之,这段脚本的目的是检测 ./debug.ini 文件中的回车符数量。如果回车符的数量大于1,则输出 "dos"。

find . -name *.cpp | xargs grep -L "-Ddebug"

列出当前目录下所有 不包含 字符串Ddebug的.cpp文件名称(有些编译选项需要所有的cpp中都包含, 这条命令就可以找出漏加的文件)

ls ./ | grep -v mac | xargs rm -rf

刪除当前目录下除了mac之外的所有其他文件

遍历目录 for xx in xx

_THREAD_PATH=.
for Thread in `ls $_THREAD_PATH`;do
	echo $Thread
done

||操作

resources_check()
{
local RESET_FLAG=`cat /mnt/mtd/config/reset_flag`

if [[ ! -d /mnt/mtd/oem/osd || 1 == $RESET_FLAG ]];then
	mkdir /mnt/mtd/oem/osd
	cp /mnt/mtd/factory/PictureLogo/* /mnt/mtd/oem/osd/ -rf
fi
}

nohup

英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行

在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中

pstree 

将所有进程以数状图显示。简单理解 ps  tree,两个命令组合了起来(手动狗头)

pstree -p 进程号 | wc -l 就可以统计当前进程使用的线程数量

pstree -p | wc -l 可以统计出当前进程使用的进程数量

ifconfig eth0 promisc(或ioctl配置IFF_PROMISC)

配置网卡进入混杂模式,混杂模式下,网卡会接受所有经过它的数据流

ifconfig eth0 -promisc 退出混杂模式

dmesg | grep 0x2: | awk '{split($5, arr, ":"); print arr[2]}'

从内核打印中匹配0x2: split($1, arr, ":") ,把第一列,以“:”为分割符分割,把分割得到的结果放入arr数字中。(arr数组从1开始)

递归显示当前目录下的所有普通文件

#!/bin/bash


function lsdir()
{
for i in `ls`;do
  if [ -d "$i" ] ;then
     cd ./$i
     lsdir
   else
     md5sum $i
   fi
done
}
lsdir

fuser -mk  /mnt/mtd

 

使用source 命令 在脚本中使用另一个脚本的参数定义

1.sh

2.sh

执行结果

将多个静态库整合成一个动态库

四则运算

加法

val=$(expr 10 + 20)

网卡模式配置

ifconfig eth0 promisc //配置混乱模式

ifconfig eth0 -promisc //退出混乱模式

nm命令

(2条消息) nm命令和其内容详解_二芒星的博客-CSDN博客_nm命令

id -u

查看用户ID, root用户是0, 可以此判断当前用户

17、EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell 

读取终端输入,根据case执行不同分之

#!bin/bash

if [ ! -d $DIR_PATH ]; then
  mkdir $DIR_PATH
fi

echo -e "input cmd : \n\t log : get log -- \n\t fps : set fsp -- \n"

read -p "please input cmd : " CMD


case $CMD in 
	log)
		echo "get log -- "

	;;
	fps)
		echo "set fsp --"
	
	;;
	*)
		echo "unknow cmd --"
	
	;;
esac


挂载临时文件系统并指定大小

#mount -t tmpfs -o size=5M tmpfs /log/

Debug

ldd

用来打印或者查看程序运行所需的共享库(访问共享对象依赖关系),常用来解决程序因缺少某个库文件而不能运行的一些问题

(105条消息) Linux :ldd 命令的介绍与使用_ldd命令_Cappuccino-jay的博客-CSDN博客在匹配行后面输出指定数量的行(105条消息) Linux :ldd 命令的介绍与使用_ldd命令_Cappuccino-jay的博客-CSDN博客

在匹配行后面输出指定数量的行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值