Linux技巧学习2


最近重温了awk和sed等编辑命令,也常用Vim进行文本的查看,学到了很多的实用技巧,记录一下:


Vim的一些技巧

浏览代码 :E

注意,是大写。之后,你可以用 j, k 键上下移动,然后回车,进入一个目录,或是找开一个文件。你可以看到上面有一堆命令:

  • 【 – 】 到上级目录
  • 【D】删除文件(大写)
  • 【R】改文件名(大写)
  • 【s】对文件排序(小写)
  • 【x】执行文件

当然,打开的文件会把现有已打开的文件给冲掉——也就是说你只看到了一个文件。如果你要改变当前浏览的目录,或是查看当前浏览的目录,你可以使用和shell一样的命令:

:cd <dir> 改变当前目录

:pwd  – 查看当前目录

缓冲区     :ls

于是,在你的Vim下,你会看到如下界面:

buffer_ls

你可以看到Vim打开了四个文件,编号是4,5,6,7,如果你要切换打开的文件,这个时候,你不要按回车(按了也没事,只不过按了就看不到:ls输出的buffer列表了),你可以使用下面的命令切换文件(buffer后面的4表示切到4号文件也就是src/http/ngx_http.c):

:buffer 4

或是:

:buffer src/http/ngx_http.c

注意:

  • 你可以像在Shell中输入命令按Tab键补全一样补全Vim的命令。
  • 也可以用像gdb一样用最前面的几个字符,只要没有冲突。如:buff

你还可以动用如下命令,快速切换:

:bnext      缩写 :bn
:bprevious   缩写 :bp
:blast  缩写 :bl
:bfirst 缩写 :bf

上图中,我们还可以看到5有一个%a,这表示当前文件,相关的标记如下:

– (非活动的缓冲区)
a (当前被激活缓冲区)
h (隐藏的缓冲区)
% (当前的缓冲区)
# (交换缓冲区)
= (只读缓冲区)
+ (已经更改的缓冲区)

窗口分屏浏览

相信你在《Vim的窗口分屏》一文中,你已经知道了怎么拆分窗口了。其实,我更多的不是用拆分窗口的命令,而是用浏览文件的命令来分隔窗口。如:

把当前窗口上下分屏,并在下面进行目录浏览:

:He   全称为 :Hexplore  (在下边分屏浏览目录)

如果你要在上面,你就在 :He后面加个 !,

:He!  (在上分屏浏览目录)

如果你要左右分屏的话,你可以这样:

:Ve 全称为 :Vexplore (在左边分屏间浏览目录,要在右边则是 :Ve!

Tab页浏览

分屏可能会让你不爽,你可能更喜欢像Chrome这样的分页式的浏览,那么你可以用下面的命令:

:Te  全称是 :Texplorer

下图中,你可以看到我用Te命令打开了三页,就在顶端我们可以可以看到有三页,其中第一页Tab上的数字3表示那一页有3个文件。

我们要在多个Tabe页中切换,在normal模式下,你可以使用下面三个按键(注意没有冒号)

gt   到下一个页

gT  – 到前一个页

{i} gt   i是数字,到指定页,比如:5 gt 就是到第5

你可以以使用 【:tabm {n}】来切换Tab页。

gvim应该是:Ctrl+PgDn 和 Ctrl+PgUp 来在各个页中切换。

如果你想看看你现在打开的窗口和Tab的情况,你可以使用下面的命令:

:tabs

于是你可以看到:

Tab01

其它的一些技巧
字符相关

【guu 】 – 把一行的文字变成全小写。或是【Vu】

【gUU】 – 把一行的文件变成全大写。或是【VU】

按【v】键进入选择模式,然后移动光标选择你要的文本,按【u】转小写,按【U】转大写

ga   查看光标处字符的ascii

g8 查看光标处字符的utf-8编码

【gf】  – 打开光标处所指的文件 (这个命令在打到#include头文件时挺好用的,当然,仅限于有路径的)

*】或【#】在当前文件中搜索当前光标的单词

缩进相关

【>>】向右缩进当前行 【<<】向左缩进当前行

【=】  – 缩进当前行 (和上面不一样的是,它会对齐缩进)

【=%】 – 把光标位置移到语句块的括号上,然后按=%,缩进整个语句块(%是括号匹配)

【G=gg】 或是 【gg=G】  – 缩进整个文件(G是到文件结尾,gg是到文件开头)

复制粘贴相关

按【v】 键进入选择模式,然后按h,j,k,l移动光标,选择文本,然后按 【y】 进行复制,按 【p】 进行粘贴。

【dd】剪切一行(前面加个数字可以剪切n行),【p】粘贴

【yy】复制一行(前面加个数字可以复制n行),【p】粘贴

光标移动相关

【Ctrl + O】向后回退你的光标移动

【Ctrl + I 】向前追赶你的光标移动

这两个快捷键很有用,可以在Tab页和Windows中向前和向后trace你的光标键,这也方便你跳转光标。

读取Shell命令相关

【:r!date】 插入日期

上面这个命令,:r 是:read的缩写,!是表明要运行一个shell命令,意思是我要把shell命令的输出读到vim里来。


超牛逼/实用的awk技巧

一些注意事项/预备知识:
  • 在单引号中的被大括号括着的就是awk的语句,注意,其只能被单引号包含。
  • 其中的$1..$n表示第几列。注:$0表示整个行。

在进行一些稍微复杂点的awk使用时,经常会碰到END关键字。END的意思是“处理完所有的行的标识”,即然说到了END就有必要介绍一下BEGIN,这两个关键字意味着执行前和执行后的意思,语法如下:

  • BEGIN{ 这里面放的是执行前的语句 }
  • END {这里面放的是处理完所有的行后要执行的语句 }
  • {这里面放的是处理每一行时要执行的语句}
用awk来过滤记录:
$ awk '$3==0 && $6=="LISTEN" ' netstat.txt

其中的“==”为比较运算符。其他比较运算符:!=, >, <, >=, <=

$ awk ' $3>0 {print $0}' netstat.txt
Proto Recv-Q Send-Q Local-Address Foreign-Address State
tcp 0 4166 coolshell.cn:80 61.148.242.38:30901 ESTABLISHED
tcp 0 1 coolshell.cn:80 124.152.181.209:26825 FIN_WAIT1
tcp 0 1 coolshell.cn:80 208.115.113.92:50601 LAST_ACK
如果我们需要表头的话,我们可以引入内建变量NR:
$ awk '$3==0 && $6=="LISTEN" || NR==1 ' netstat.txt
Proto Recv-Q Send-Q Local-Address Foreign-Address State
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
awk的内建变量:
$0 当前记录(这个变量中存放着整个行的内容)
$1~$n 当前记录的第n个字段,字段间由FS分隔
FS 输入字段分隔符 默认是空格或Tab
NF 当前记录中的字段个数,就是有多少列
NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
RS 输入的记录分隔符, 默认为换行符
OFS 输出字段分隔符, 默认也是空格
ORS 输出的记录分隔符,默认为换行符
FILENAME 当前输入文件的名字

 

# awk调用外部变量是需要用“单引号”括起来。或者在前面用 -v 选项添加这个外部变量。
# awk '{if($1>='$n') print $2}' file
折分文件

awk拆分文件很简单,使用重定向就好了。下面这个例子,是按第6例分隔文件,相当的简单(其中的NR!=1表示不处理表头)。

$ awk 'NR!=1{print > $6}' netstat.txt
统计

下面的命令计算所有的C文件,CPP文件和H文件的文件大小总和。

$ ls -l *.cpp *.c *.h | awk '{sum+=$5} END {print sum}'
2511401

Bash中的for循环(如何从Linux原生系统中找到解决问题的提示?直接执行命令:man bash即可查看。)
脚本example.sh
#!/bin/sh
for i in {1..100}; do
    echo $i
done
如果简单执行:./example.sh ,输出为:
{1..100}
但是如果将第一行修改为#!/bin/bash 则可以按照自己的预期输出1-100的循环;当然,也可以通过命令:bash example.sh来达到同样的目的。唉,选择的shell不同,得到的结果也不同,需要注意啊!
对于shell编程中的各种坑,真的是踩也踩不完o(╯□╰)o


#生成复杂密码
openssl rand 20 -base64
uuidgen
#Vim
:w !sudo tee %
#统计某一文件夹(包括子文件夹下)的文件个数
#方法一:
ls -lR | grep "^-" | wc -l
#方法二:
find ./ -type f | wc -l
去掉文件中的utf-8 BOM头
awk '{if(NR==1)sub(/^xefxbbxbf/,"") print}' input.txt > output.txt
比较两个文件,找出在1.txt中不在2.txt中的内容
awk 'NR==FNR{a[$0]++}NR>FNR{if(a[$0]==0) print}' 1.txt 2.txt > diff.txt

 

 

学习地址:
, ,

《 “Linux技巧学习2” 》 有 6 条评论

  1. #生成复杂密码
    `
    genpasswd() {
    local l=$1
    [ “$l” == “” ] && l=20
    tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs
    }

    genpasswd 16
    `

  2. Linux下快速生成随机复杂密码(以16位长度为例)
    `
    # openssl rand 16 -base64 # -base64 参数用于确保生成的密码可以被键盘敲出来

    # gpg –gen-random –armor 1 16 # 生成 1 个长度为 16 个字符的高强度密码

    # uuidgen | tr ‘-‘ ‘_’ | head -c16
    `

  3. 10个高效Linux技巧及Vim命令对比
    https://vimjc.com/linux-vim-tricks.html
    `
    (1) :Linux 命令行下执行该命令,将光标移动到行首 (a 是 ahead 的缩写)

    (2) :Linux 命令行下执行该命令,将光标移动到行尾 (e 是 end 的缩写)

    (3) :Linux 命令行下执行该命令,会进入历史命令查找窗口,输入要查找的命令可快速选择历史命令

    (4) :Linux 命令行下执行该命令,会删除当前光标附近的一个词 (以空格隔开的字符串)

    (5) :Linux 命令行下执行该命令,会删除命令行上已经敲出来的所有文本 (即删除整行)

    (6) :Linux 命令行下执行该命令,将粘贴 、 等命令删除的文本

    (7) !xx关键字:Linux 命令行下执行该命令,会执行最近一条包含有 xx关键字 的历史命令

    (8) cd -:Linux 命令行下执行该命令,会将当前目录切换到上一次所在目录

    (9) :Linux 命令行下执行该命令,可粘贴复制到系统剪切板上的内容

    (10) :Linux 命令行下执行该命令,可清空当前屏幕
    `

    30个Vim常用命令和使用技巧整理 (长期更新)
    https://vimjc.com/vim-tips.html

  4. https://unix.stackexchange.com/questions/498001/splitting-file-by-1st-column-too-many-open-files
    `
    # 用AWK拆分文件的报错 too many open files
    # 正解,报错之所以出现,是因为AWK根据输入数据创建的名称,而如果数据数据的行数过多,则会为每一行都创建文件,因此这里需要用数组的方式减少需要创建的文件数量,即可避免报错,同时也要记得及时关闭文件。

    awk ‘NR!=1 { if(a[f=$1″.txt”]++) print >> f; else print > f; close(f) }’ input_content.txt
    `

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注