linux下各种工具以及shell经验总结

本文提供了Linux环境下一系列常用命令的快速指南,包括ls、grep、awk、vim等,覆盖文件管理、文本处理、编辑器使用及shell脚本技巧,适合初学者及日常工作中查找参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章是从我多年前的博客倒腾过来的,以后我会继续慢慢更新这篇文章。

1.ls
1)选项-1:所有结果显示为一列

2.grep
-c:只显示匹配结果的总行数
grep -c "gejun" test.txt
-v:不匹配选项
grep -v "UHCI" test.txt
显示不匹配UHCI的行
cat ./test.log | grep -v 'XXX'
过滤不含有XXX的文本
grep test * -r
-i 是忽略大小写
-r 是递归搜索目录
精确匹配
grep '\<要搜索的字符串\>' * -R
其他:
grep -nr * "aa\|bb\|cc\|dd"
aa 或 bb 或 cc 或 dd
grep -nr * ^a
首字符是 a

3.awk
1)基本方法:
echo $disksize | awk -F \" '{
       printf "%s",$2
}'
这句话的含义:
以"为分隔符分析disksize字符串的值。
例:disksize="ge\"jun" 则结果应该为jun
2)grep与awk联合使用:效果是取文本文件中特定行的特定列的值,类似于sql中的选择和投影。
例:
cat test.txt | grep RecordNo | grep -v HuaYi | awk -F = '{
 printf "%s",$2
}'
3)ls只显示目录名
ls -l | awk '/^d/ { printf "%s\n",$9 }'
^d:意为匹配行首为d的行

4) awk脚本可以用sub函数替代删除操作。

cat genReportsGUIAudit.cpp | awk -F = '{
if ($0~/qWideChar2UTF8String\(ToCVString\(/) {
    str = $0
    sub("qWideChar2UTF8String\(ToCVString\(","qWideChar2UTF8String(",str)
    sub(/\).c_str\(\)/,"",str)
    printf "%s\n", str
}
else
    printf "%s\n", $0
}' > genReportsGUIAudit.cpp.bak

4.dd
可以指定跳过输入或输出流的字节数,例如下面就是跳过输入流一个block.
dd if=$mountdev of=$tmploopfile bs=1M count=`expr $size - 1` skip=1

5. vim
1) :u 就是 undo ,这条命令可以直接输入 u 不必加 :
2) :set noic 大小写敏感
3) :set nu 显示行号
4) N 上一个搜索结果,n 下一个搜索结果
5) :/\<待搜索字符串\> 全词匹配
6) :n,$s/被替换字符串/替换字符串/g,n 表示从第 n 行开始替换
:1,$s/\,/\, /g     把“,”替换为“, ”,注意转义符在这里的使用
:1,$s/^M//g     怎么替换“^M”?^M 注意要用 Ctrl + V 和 Ctrl + M 来输入
7) 调出历史命令列表 q:
8)  Ctrl-R: Redo
9) % 括号匹配
10) wq! 编辑只读文件,保存的时候用这条命令。
11) vim 怎么打开多个文件?直接 vim *.xxx
12) 怎么删除每行第一个字符?:%s/^.//g
13) 格式化 C 代码, gg=G
14) guw 把光标后面的单词转为小写
15)
进入二进制编辑模式 :%!xxd
退出二进制编辑模式 :%!xxd -r
16) 高亮搜索结果 :set hlsearch
17) :bn :bp 显示下一个和前一个打开的文件,ctrl + 6 显示下一个文件,e XXX 打开一个文件
18) :!命令 执行shell的命令
19) :w!命令保存只读文件
20) set list 显示换行符回车符等等
21) set tabstop=4 设置tab的缩进
22) 常用的vim配置
  1 set nu
  2 set hlsearch
  3 cs add cscope.out
  4 set history=1000
  5 hi Comment term=bold ctermfg=6 guifg=DarkCyan
  6 set tabstop=4
23) ls 显示打开文件列表,b1 b2 文件切换
24) gnw case conversion

6. df
df -ah

7. wc
下面这条命令可以统计当前目录下所有文件的总行数。
wc -l ./*

8. ldd
linux 查看可执行文件依赖的动态链接库用 ldd

9. cat
用 cat 合并文件: cat *.xxx > 新文件名

10. watch -n XXX "command"
可以对command做类似top的监视

11. sed -i "s/oldstring/newstring/g" `grep oldstring -rl .`

批量替换字符串

例如,sed -i bak "s/#include \"deviceapis\/services\/student\/DataService\.h\"/#include \"deviceapis\/services\/shared\/DataService\.h\"/g" `grep "DataService.h" -rl .`

12. diff file1 file2 -b
忽略空格比较

13. 查看文本文件中间的内容
tail与head结合使用
如,cat xxx.txt | tail -n 1000 | head -n 100

14. dc计算器
加了16op后,可以输出16进制hex
echo $((1<<2)) 16op|dc

15. bc计算器
下面的例子做浮点运算
echo "1.55 - 0.00625 * 2"|bc

其他.shell小技巧:

1)判断一字符串是否为空:
[ -z "$removable" ]
注意,这里要加双引号。否则removable如果包含空格的话就会出错。
例:removable=ge jun
用不加双引号的[ -z $removable ]判断就会出错

2)生成随机数
cat /dev/urandom | head -n 1 | md5sum | head -c 8

3)怎么取一个变量的前几个字符
${var:n:m}
取var包含的字符串的从n开始的m个字符。

4)取文本的前几行或者一行的前几个字符
cat test.txt | head -n 1 | head -c 8

5)shell变量:
关于shell变量在cu上发了个帖子。下面做了些整理。
注意在shell中的管道会开一个新进程,从而可能使得shell变量失效。
例如下文中的嵌套循环。解决方法可以参考第二个回帖。
a)原帖:
下文这段简单的脚本中test变量的值最终应该显示为“changed”但不知为什么就是显示成“init”,
我调试的头都快爆了,也找不到原因
请各位帮我看看 谢谢!
#!/bin/sh
while [ 1 ] ;do
  test="init"
  ls -1 | \
  while read devline;do
   test="changed"
   break
  done
  echo $test
  break
done
b)smallstar001回帖:
#!/bin/sh
while [ 1 ] ;do
  test="init"
  ls -1 | \
  while read devline;
  do
   echo $devline
   test="changed"
   a=2
   break
  done
  echo $a
  echo $test
  break
done
[root@CCOSS_310968054 shl]# sh test2.sh
arr.sh
init
[root@CCOSS_310968054 shl]#
看看就明白了,子shell是没法修改父shell的东西的
c)seeLnd 的回帖:
#!/bin/sh
while [ 1 ] ;do
  test="init"
  while read devline;do
   test="changed"
   break
  done <<<$(ls -1)
  echo $test
  break
done

6)获取name="value"的value部分的值有什么好办法吗?在cu上发了个帖子,问题和答案如下:
问题:
value="123456"
请问这种格式的字符串有什么好办法取123456呢?我现在使用awk来取,效率有点低。
方法如下:
echo "value=\"123456\"" | awk -F = '{
printf "%s", $2
}'
谢谢。
答案:
$ str='value="123456"'
$ echo $str
value="123456"
$ echo ${str#*=}
"123456"

7)部分技巧可以参考这篇小文:
http://thinkoftrain.spaces.live.com/blog/cns!C812D47081EEE59C!1599.entry

8)怎么输出一个空行?
echo -e "\n"

9)变量赋值等号前后不要有空格
比如:RESULT   =  "test" , 这样就会有问题。

10)算术运算需要多加一层括号:
VAL1=1
VAL2=2
RTCRESULT=$(($VAL1 - $VAL2))

11)ctrl + a / e 用来移动光标到 shell 输入的行首或者行尾。

12)下面是一份 awk 的脚本代码
示范了正则表达式,字符串函数的使用。

cat ./$TARFILE | grep "Abhijeet_AMDOCS" | awk -F = '{

if ($1~/cost time/)
    costtime=substr($2,1,index($2,",")-1);
   
if ($2~/cpu_usage/)
    cpuusage=substr($3,1,index($3,",")-1);
   
if ($3~/addr/)
    addr=$4;

if ($0~/1 3 6 /) {
    oid=substr($0,index($0,"1 3 6 "));
    gsub(" ",".",oid);
    oid=substr(oid,1,index(oid,"..")-1);
}

if ($0~/1 3 6 /) {
    printf "%s,%s,%s,%s,%s,%s,%s\n",oid,costtime,cpuusage,addr,(vlagisldown~/1/)?"vlagisldown":"",(vlaghealthdown~/1/)?"vlaghealthdown":"",(lacpdown~/1/)?"lacpdown":""
   
    vlagisldown="0";
    vlaghealthdown="0";
    lacpdown="0";
}

if ($0~/vLAG ISL is DOWN/) {
    vlagisldown="1";
}

if ($0~/Health check is Down/) {
    vlaghealthdown="1";
}

if ($0~/LACP is down/) {
    lacpdown="1";
}
   
}' > $TARFILE.res

13)下面是一份 awk 的脚本代码
示范了如何在 awk 中做字符串的合并。
#!/bin/sh
TARFILE=./$1
cat ./$TARFILE | grep "Abhijeet_AMDOCS" | awk -F = '{
oidurlpre="http://tools.cisco.com/Support/SNMP/do/BrowseOID.do?objectInput="
oidurlpost="&translate=Translate&submitValue=SUBMIT&submitClicked=true"
timestamp=substr($0,1,index($0,"Abhijeet_AMDOCS")-1);

if ($1~/cost time/)
    costtime=substr($2,1,index($2,",")-1);

if ($2~/cpu_usage/)
    cpuusage=substr($3,1,index($3,",")-1);

if ($3~/addr/)
    addr=substr($4,1,index($4,",")-1);

if ($0~/1\.3\.6\./) {
    oid=substr($0,index($0,"1.3.6."));
    oid=substr(oid,1,index(oid,"..")-1);
        oidurl=oidurlpre oid oidurlpost;
}

if ($0~/1\.3\.6\./) {
    printf "%s,%s,%s,%s,%s,%s,%s,%s,%s\n",timestamp,oid,costtime,cpuusage,addr,(vlagisldown~/1/)?"vlagisldown":"",(vlaghealthdown~/1/)?"vlaghealthdown":"",(lacpdown~/1/)?"lacpdown":"",(vlagisldown~/1/ || vlaghealthdown~/1/ || lacpdown~/1/)?oidurl:""

    vlagisldown="0";
    vlaghealthdown="0";
    lacpdown="0";
}

if ($0~/vLAG ISL is DOWN/) {
    vlagisldown="1";
}

if ($0~/Health check is Down/) {
    vlaghealthdown="1";
}

if ($0~/LACP is down/) {
    lacpdown="1";
}

}' > $TARFILE.csv

14)下面是一份示范如何在 shell 里面读取文件的脚本代码
#!/bin/sh
while read LINE
do
    ./parse.sh $LINE
done < $1

15)有时候程序输出 "XXX \r\n" 的时候会引起 awk 没法正常解析。这是要把 "\r" 过滤掉才能正常解析

16)set | grep XXX 可以用来查环境变量

17)解压缩bz2
tar -xjf XXX.bz2

18)如果遇到grep不支持-r的情况,可以用
find . | xargs grep XXX

19)find . 列出当前目录的所有文件,很实用

20)set -o emacs 切换到emacs风格的bash

21)which可以看到执行文件的全路径

22)set 可以看到当前所有的环境变量

23)命令的返回值在$?

模板脚本的源代码:
linux编译脚本 rtctest 开发板测试脚本
ulv test script
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值