我的袜子都是洞

记录个人简单思考

命令行的艺术

熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。

前言

涵盖范围:

  • 这篇文章不仅能帮助刚接触命令行的新手,而且对具有经验的人也大有裨益。本文致力于做到覆盖面广(涉及所有重要的内容),具体(给出具体的最常用的例子),以及简洁(避免冗余的内容,或是可以在其他地方轻松查到的细枝末节)。在特定应用场景下,本文的内容属于基本功或者能帮助您节约大量的时间。
  • 本文主要为 Linux 所写,但在仅限 OS X 系统章节和仅限 Windows 系统章节中也包含有对应操作系统的内容。除去这两个章节外,其它的内容大部分均可在其他类 Unix 系统或 OS X,甚至 Cygwin 中得到应用。
  • 本文主要关注于交互式 Bash,但也有很多技巧可以应用于其他 shell 和 Bash 脚本当中。
  • 除去“标准的”Unix 命令,本文还包括了一些依赖于特定软件包的命令(前提是它们具有足够的价值)。

注意事项:

  • 为了能在一页内展示尽量多的东西,一些具体的信息可以在引用的页面中找到。我们相信机智的你知道如何使用 Google 或者其他搜索引擎来查阅到更多的详细信息。文中部分命令需要您使用 apt-getyumdnfpacman
    pipbrew(以及其它合适的包管理器)来安装依赖的程序。
  • 遇到问题的话,请尝试使用 Explainshell 去获取相关命令、参数、管道等内容的解释。

基础

  • 学习 Bash 的基础知识。具体地,在命令行中输入 man bash 并至少全文浏览一遍; 它理解起来很简单并且不冗长。其他的 shell 可能很好用,但 Bash 的功能已经足够强大并且到几乎总是可用的( 如果你学习 zsh,fish 或其他的 shell 的话,在你自己的设备上会显得很方便,但过度依赖这些功能会给您带来不便,例如当你需要在服务器上工作时)。

  • 熟悉至少一个基于文本的编辑器。通常而言 Vim (vi) 会是你最好的选择,毕竟在终端中编辑文本时 Vim 是最好用的工具(甚至大部分情况下 Vim 要比 Emacs、大型 IDE 或是炫酷的编辑器更好用)。

  • 学会如何使用 man 命令去阅读文档。学会使用 apropos 去查找文档。知道有些命令并不对应可执行文件,而是在 Bash 内置好的,此时可以使用 helphelp -d 命令获取帮助信息。你可以用 type 命令 来判断这个命令到底是可执行文件、shell 内置命令还是别名。

  • 学会使用 >< 来重定向输出和输入,学会使用 | 来重定向管道。明白 > 会覆盖了输出文件而 >> 是在文件末添加。了解标准输出 stdout 和标准错误 stderr。

  • 学会使用通配符 * (或许再算上 ?[]) 和引用以及引用中 '" 的区别(后文中有一些具体的例子)。

  • 熟悉 Bash 中的任务管理工具:&ctrl-zctrl-cjobsfgbgkill 等。

  • 学会使用 ssh 进行远程命令行登录,最好知道如何使用 ssh-agentssh-add 等命令来实现基础的无密码认证登录。

  • 学会基本的文件管理工具:lsls -l (了解 ls -l 中每一列代表的意义),lessheadtailtail -f (甚至 less +F),lnln -s (了解硬链接与软链接的区别),chownchmoddu (硬盘使用情况概述:du -hs *)。 关于文件系统的管理,学习 dfmountfdiskmkfslsblk。知道 inode 是什么(与 ls -idf -i 等命令相关)。

  • 学习基本的网络管理工具:ipifconfigdig

  • 学习并使用一种版本控制管理系统,例如 git

  • 熟悉正则表达式,学会使用 grepegrep,它们的参数中 -i-o-v-A-B-C 这些是很常用并值得认真学习的。

  • 学会使用 apt-getyumdnfpacman (具体使用哪个取决于你使用的 Linux 发行版)来查找和安装软件包。并确保你的环境中有 pip 来安装基于 Python 的命令行工具 (接下来提到的部分程序使用 pip 来安装会很方便)。

日常使用

  • 在 Bash 中,可以通过按 Tab 键实现自动补全参数,使用 ctrl-r 搜索命令行历史记录(按下按键之后,输入关键字便可以搜索,重复按下 ctrl-r 会向后查找匹配项,按下 Enter 键会执行当前匹配的命令,而按下右方向键会将匹配项放入当前行中,不会直接执行,以便做出修改)。

  • 在 Bash 中,可以按下 ctrl-w 删除你键入的最后一个单词,ctrl-u 可以删除行内光标所在位置之前的内容,alt-balt-f 可以以单词为单位移动光标,ctrl-a 可以将光标移至行首,ctrl-e 可以将光标移至行尾,ctrl-k 可以删除光标至行尾的所有内容,ctrl-l 可以清屏。键入 man readline 可以查看 Bash 中的默认快捷键。内容有很多,例如 alt-. 循环地移向前一个参数,而 alt-* 可以展开通配符。

  • 你喜欢的话,可以执行 set -o vi 来使用 vi 风格的快捷键,而执行 set -o emacs 可以把它改回来。

  • 为了便于编辑长命令,在设置你的默认编辑器后(例如 export EDITOR=vim),ctrl-x ctrl-e 会打开一个编辑器来编辑当前输入的命令。在 vi 风格下快捷键则是 escape-v

  • 键入 history 查看命令行历史记录,再用 !nn 是命令编号)就可以再次执行。其中有许多缩写,最有用的大概就是 !$, 它用于指代上次键入的参数,而 !! 可以指代上次键入的命令了(参考 man 页面中的“HISTORY EXPANSION”)。不过这些功能,你也可以通过快捷键 ctrl-ralt-. 来实现。

  • cd 命令可以切换工作路径,输入 cd ~ 可以进入 home 目录。要访问你的 home 目录中的文件,可以使用前缀 ~(例如 ~/.bashrc)。在 sh 脚本里则用环境变量 $HOME 指代 home 目录的路径。

  • 回到前一个工作路径:cd -

  • 如果你输入命令的时候中途改了主意,按下 alt-# 在行首添加 # 把它当做注释再按下回车执行(或者依次按下 ctrl-a, **#**, enter)。这样做的话,之后借助命令行历史记录,你可以很方便恢复你刚才输入到一半的命令。

  • 使用 xargs ( 或 parallel)。他们非常给力。注意到你可以控制每行参数个数(-L)和最大并行数(-P)。如果你不确定它们是否会按你想的那样工作,先使用 xargs echo 查看一下。此外,使用 -I{} 会很方便。例如:

    1
    2
    find . -name '*.py' | xargs grep some_function
    cat hosts | xargs -I{} ssh root@{} hostname
  • pstree -p 以一种优雅的方式展示进程树。

  • 使用 pgreppkill 根据名字查找进程或发送信号(-f 参数通常有用)。

  • 了解你可以发往进程的信号的种类。比如,使用 kill -STOP [pid] 停止一个进程。使用 man 7 signal 查看详细列表。

  • 使用 nohupdisown 使一个后台进程持续运行。

  • 使用 netstat -lntpss -plat 检查哪些进程在监听端口(默认是检查 TCP 端口; 添加参数 -u 则检查 UDP 端口)或者 lsof -iTCP -sTCP:LISTEN -P -n (这也可以在 OS X 上运行)。

  • lsof 来查看开启的套接字和文件。

  • 使用 uptimew 来查看系统已经运行多长时间。

  • 使用 alias 来创建常用命令的快捷形式。例如:alias ll='ls -latr' 创建了一个新的命令别名 ll

  • 可以把别名、shell 选项和常用函数保存在 ~/.bashrc。这样做的话你就可以在所有 shell 会话中使用你的设定。

  • 把环境变量的设定以及登陆时要执行的命令保存在 ~/.bash_profile。而对于从图形界面启动的 shell 和 cron 启动的 shell,则需要单独配置文件。

  • 要想在几台电脑中同步你的配置文件(例如 .bashrc.bash_profile),可以借助 Git。

  • 当变量和文件名中包含空格的时候要格外小心。Bash 变量要用引号括起来,比如 "$FOO"。尽量使用 -0-print0 选项以便用 NULL 来分隔文件名,例如 locate -0 pattern | xargs -0 ls -alfind / -print0 -type d | xargs -0 ls -al。如果 for 循环中循环访问的文件名含有空字符(空格、tab 等字符),只需用 IFS=$'\n' 把内部字段分隔符设为换行符。

  • 在 Bash 脚本中,使用 set -x 去调试输出(或者使用它的变体 set -v,它会记录原始输入,包括多余的参数和注释)。尽可能地使用严格模式:使用 set -e 令脚本在发生错误时退出而不是继续运行;使用 set -u 来检查是否使用了未赋值的变量;试试 set -o pipefail,它可以监测管道中的错误。当牵扯到很多脚本时,使用 trap 来检测 ERR 和 EXIT。一个好的习惯是在脚本文件开头这样写,这会使它能够检测一些错误,并在错误发生时中断程序并输出信息:

    1
    2
    set -euo pipefail
    trap "echo 'error: Script failed: see failed command above'" ERR
  • 在 Bash 脚本中,子 shell(使用括号 (...))是一种组织参数的便捷方式。一个常见的例子是临时地移动工作路径,代码如下:

    1
    2
    3
    # do something in current dir
    (cd /some/other/dir && other-command)
    # continue in original dir
  • 在 Bash 中,变量有许多的扩展方式。${name:?error message} 用于检查变量是否存在。此外,当 Bash 脚本只需要一个参数时,可以使用这样的代码 input_file=${1:?usage: $0 input_file}。在变量为空时使用默认值:${name:-default}。如果你要在之前的例子中再加一个(可选的)参数,可以使用类似这样的代码 output_file=${2:-logfile},如果省略了 $2,它的值就为空,于是 output_file 就会被设为 logfile。数学表达式:i=$(( (i + 1) % 5 ))。序列:{1..10}。截断字符串:${var%suffix}${var#prefix}。例如,假设 var=foo.pdf,那么 echo ${var%.pdf}.txt 将输出 foo.txt

  • 使用括号扩展({})来减少输入相似文本,并自动化文本组合。这在某些情况下会很有用,例如 mv foo.{txt,pdf} some-dir(同时移动两个文件),cp somefile{,.bak}(会被扩展成 cp somefile somefile.bak)或者 mkdir -p test-{a,b,c}/subtest-{1,2,3}(会被扩展成所有可能的组合,并创建一个目录树)。

  • 通过使用 <(some command) 可以将输出视为文件。例如,对比本地文件 /etc/hosts 和一个远程文件:

    1
    diff /etc/hosts <(ssh somehost cat /etc/hosts)
  • 编写脚本时,你可能会想要把代码都放在大括号里。缺少右括号的话,代码就会因为语法错误而无法执行。如果你的脚本是要放在网上分享供他人使用的,这样的写法就体现出它的好处了,因为这样可以防止下载不完全代码被执行。

    1
    2
    3
    {
    # 在这里写代码
    }
  • 了解 Bash 中的“here documents”,例如 cat <<EOF ...

  • 在 Bash 中,同时重定向标准输出和标准错误:some-command >logfile 2>&1 或者 some-command &>logfile。通常,为了保证命令不会在标准输入里残留一个未关闭的文件句柄捆绑在你当前所在的终端上,在命令后添加 </dev/null 是一个好习惯。

  • 使用 man ascii 查看具有十六进制和十进制值的ASCII表。man unicodeman utf-8,以及 man latin1 有助于你去了解通用的编码信息。

  • 使用 screentmux 来使用多份屏幕,当你在使用 ssh 时(保存 session 信息)将尤为有用。而 byobu 可以为它们提供更多的信息和易用的管理工具。另一个轻量级的 session 持久化解决方案是 dtach

  • ssh 中,了解如何使用 -L-D(偶尔需要用 -R)开启隧道是非常有用的,比如当你需要从一台远程服务器上访问 web 页面。

  • 对 ssh 设置做一些小优化可能是很有用的,例如这个 ~/.ssh/config 文件包含了防止特定网络环境下连接断开、压缩数据、多通道等选项:

    1
    2
    3
    4
    5
    6
    7
    TCPKeepAlive=yes
    ServerAliveInterval=15
    ServerAliveCountMax=6
    Compression=yes
    ControlMaster auto
    ControlPath /tmp/%r@%h:%p
    ControlPersist yes
  • 一些其他的关于 ssh 的选项是与安全相关的,应当小心翼翼的使用。例如你应当只能在可信任的网络中启用 StrictHostKeyChecking=noForwardAgent=yes

  • 考虑使用 mosh 作为 ssh 的替代品,它使用 UDP 协议。它可以避免连接被中断并且对带宽需求更小,但它需要在服务端做相应的配置。

  • 获取八进制形式的文件访问权限(修改系统设置时通常需要,但 ls 的功能不那么好用并且通常会搞砸),可以使用类似如下的代码:

    1
    stat -c '%A %a %n' /etc/timezone
  • 使用 percol 或者 fzf 可以交互式地从另一个命令输出中选取值。

  • 使用 fppPathPicker)可以与基于另一个命令(例如 git)输出的文件交互。

  • 将 web 服务器上当前目录下所有的文件(以及子目录)暴露给你所处网络的所有用户,使用:
    python -m SimpleHTTPServer 7777 (使用端口 7777 和 Python 2)或python -m http.server 7777 (使用端口 7777 和 Python 3)。

  • 以其他用户的身份执行命令,使用 sudo。默认以 root 用户的身份执行;使用 -u 来指定其他用户。使用 -i 来以该用户登录(需要输入_你自己的_密码)。

  • 将 shell 切换为其他用户,使用 su username 或者 su - username。加入 - 会使得切换后的环境与使用该用户登录后的环境相同。省略用户名则默认为 root。切换到哪个用户,就需要输入_哪个用户的_密码。

  • 了解命令行的 128K 限制。使用通配符匹配大量文件名时,常会遇到“Argument list too long”的错误信息。(这种情况下换用 findxargs 通常可以解决。)

  • 当你需要一个基本的计算器时,可以使用 python 解释器(当然你要用 python 的时候也是这样)。例如:

    1
    2
    >>> 2+3
    5

文件及数据处理

  • 在当前目录下通过文件名查找一个文件,使用类似于这样的命令:find . -iname '*something*'。在所有路径下通过文件名查找文件,使用 locate something (但注意到 updatedb 可能没有对最近新建的文件建立索引,所以你可能无法定位到这些未被索引的文件)。

  • 使用 ag 在源代码或数据文件里检索(grep -r 同样可以做到,但相比之下 ag 更加先进)。

  • 将 HTML 转为文本:lynx -dump -stdin

  • Markdown,HTML,以及所有文档格式之间的转换,试试 pandoc

  • 当你要处理棘手的 XML 时候,xmlstarlet 算是上古时代流传下来的神器。

  • 使用 jq 处理 JSON。

  • 使用 shyaml 处理 YAML。

  • 要处理 Excel 或 CSV 文件的话,csvkit 提供了 in2csvcsvcutcsvjoincsvgrep 等方便易用的工具。

  • 当你要处理 Amazon S3 相关的工作的时候,s3cmd 是一个很方便的工具而 s4cmd 的效率更高。Amazon 官方提供的 aws 以及 saws 是其他 AWS 相关工作的基础,值得学习。

  • 了解如何使用 sortuniq,包括 uniq 的 -u 参数和 -d 参数,具体内容在后文单行脚本节中。另外可以了解一下 comm

  • 了解如何使用 cutpastejoin 来更改文件。很多人都会使用 cut,但遗忘了 join

  • 了解如何运用 wc 去计算新行数(-l),字符数(-m),单词数(-w)以及字节数(-c)。

  • 了解如何使用 tee 将标准输入复制到文件甚至标准输出,例如 ls -al | tee file.txt

  • 要进行一些复杂的计算,比如分组、逆序和一些其他的统计分析,可以考虑使用 datamash

  • 注意到语言设置(中文或英文等)对许多命令行工具有一些微妙的影响,比如排序的顺序和性能。大多数 Linux 的安装过程会将 LANG 或其他有关的变量设置为符合本地的设置。要意识到当你改变语言设置时,排序的结果可能会改变。明白国际化可能会使 sort 或其他命令运行效率下降许多倍。某些情况下(例如集合运算)你可以放心的使用 export LC_ALL=C 来忽略掉国际化并按照字节来判断顺序。

  • 你可以单独指定某一条命令的环境,只需在调用时把环境变量设定放在命令的前面,例如 TZ=Pacific/Fiji date 可以获取斐济的时间。

  • 了解如何使用 awksed 来进行简单的数据处理。 参阅 One-liners 获取示例。

  • 替换一个或多个文件中出现的字符串:

    1
    perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
  • 使用 repren 来批量重命名文件,或是在多个文件中搜索替换内容。(有些时候 rename 命令也可以批量重命名,但要注意,它在不同 Linux 发行版中的功能并不完全一样。)

    1
    2
    3
    4
    5
    6
    # 将文件、目录和内容全部重命名 foo -> bar:
    repren --full --preserve-case --from foo --to bar .
    # 还原所有备份文件 whatever.bak -> whatever:
    repren --renames --from '(.*)\.bak' --to '\1' *.bak
    # 用 rename 实现上述功能(若可用):
    rename 's/\.bak$//' *.bak
  • 根据 man 页面的描述,rsync 是一个快速且非常灵活的文件复制工具。它闻名于设备之间的文件同步,但其实它在本地情况下也同样有用。在安全设置允许下,用 rsync 代替 scp 可以实现文件续传,而不用重新从头开始。它同时也是删除大量文件的最快方法之一:

    1
    mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
  • 若要在复制文件时获取当前进度,可使用 pvpycpprogressrsync --progress。若所执行的复制为block块拷贝,可以使用 dd status=progress

  • 使用 shuf 可以以行为单位来打乱文件的内容或从一个文件中随机选取多行。

  • 了解 sort 的参数。显示数字时,使用 -n 或者 -h 来显示更易读的数(例如 du -h 的输出)。明白排序时关键字的工作原理(-t-k)。例如,注意到你需要 -k1,1 来仅按第一个域来排序,而 -k1 意味着按整行排序。稳定排序(sort -s)在某些情况下很有用。例如,以第二个域为主关键字,第一个域为次关键字进行排序,你可以使用 sort -k1,1 | sort -s -k2,2

  • 如果你想在 Bash 命令行中写 tab 制表符,按下 ctrl-v [Tab] 或键入 $'\t' (后者可能更好,因为你可以复制粘贴它)。

  • 标准的源代码对比及合并工具是 diffpatch。使用 diffstat 查看变更总览数据。注意到 diff -r 对整个文件夹有效。使用 diff -r tree1 tree2 | diffstat 查看变更的统计数据。vimdiff 用于比对并编辑文件。

  • 对于二进制文件,使用 hdhexdump 或者 xxd 使其以十六进制显示,使用 bvihexedit 或者 biew 来进行二进制编辑。

  • 同样对于二进制文件,strings(包括 grep 等工具)可以帮助在二进制文件中查找特定比特。

  • 制作二进制差分文件(Delta 压缩),使用 xdelta3

  • 使用 iconv 更改文本编码。需要更高级的功能,可以使用 uconv,它支持一些高级的 Unicode 功能。例如,这条命令移除了所有重音符号:

    1
    uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt
  • 拆分文件可以使用 split(按大小拆分)和 csplit(按模式拆分)。

  • 操作日期和时间表达式,可以用 dateutils 中的 dateadddatediffstrptime 等工具。

  • 使用 zlesszmorezcatzgrep 对压缩过的文件进行操作。

  • 文件属性可以通过 chattr 进行设置,它比文件权限更加底层。例如,为了保护文件不被意外删除,可以使用不可修改标记:sudo chattr +i /critical/directory/or/file

  • 使用 getfaclsetfacl 以保存和恢复文件权限。例如:

    1
    2
    getfacl -R /some/path > permissions.txt
    setfacl --restore=permissions.txt
  • 为了高效地创建空文件,请使用 truncate(创建稀疏文件),fallocate(用于 ext4,xfs,btrf 和 ocfs2 文件系统),xfs_mkfile(适用于几乎所有的文件系统,包含在 xfsprogs 包中),mkfile(用于类 Unix 操作系统,比如 Solaris 和 Mac OS)。

系统调试

  • curlcurl -I 可以被轻松地应用于 web 调试中,它们的好兄弟 wget 也是如此,或者也可以试试更潮的 httpie

  • 获取 CPU 和硬盘的使用状态,通常使用使用 tophtop 更佳),iostatiotop。而 iostat -mxz 15 可以让你获悉 CPU 和每个硬盘分区的基本信息和性能表现。

  • 使用 netstatss 查看网络连接的细节。

  • dstat 在你想要对系统的现状有一个粗略的认识时是非常有用的。然而若要对系统有一个深度的总体认识,使用 glances,它会在一个终端窗口中向你提供一些系统级的数据。

  • 若要了解内存状态,运行并理解 freevmstat 的输出。值得留意的是“cached”的值,它指的是 Linux 内核用来作为文件缓存的内存大小,而与空闲内存无关。

  • Java 系统调试则是一件截然不同的事,一个可以用于 Oracle 的 JVM 或其他 JVM 上的调试的技巧是你可以运行 kill -3 <pid> 同时一个完整的栈轨迹和堆概述(包括 GC 的细节)会被保存到标准错误或是日志文件。JDK 中的 jpsjstatjstackjmap 很有用。SJK tools 更高级。

  • 使用 mtr 去跟踪路由,用于确定网络问题。

  • ncdu 来查看磁盘使用情况,它比寻常的命令,如 du -sh *,更节省时间。

  • 查找正在使用带宽的套接字连接或进程,使用 iftopnethogs

  • ab 工具(Apache 中自带)可以简单粗暴地检查 web 服务器的性能。对于更复杂的负载测试,使用 siege

  • wiresharktsharkngrep 可用于复杂的网络调试。

  • 了解 straceltrace。这俩工具在你的程序运行失败、挂起甚至崩溃,而你却不知道为什么或你想对性能有个总体的认识的时候是非常有用的。注意 profile 参数(-c)和附加到一个运行的进程参数 (-p)。

  • 了解使用 ldd 来检查共享库。但是永远不要在不信任的文件上运行

  • 了解如何运用 gdb 连接到一个运行着的进程并获取它的堆栈轨迹。

  • 学会使用 /proc。它在调试正在出现的问题的时候有时会效果惊人。比如:/proc/cpuinfo/proc/meminfo/proc/cmdline/proc/xxx/cwd/proc/xxx/exe/proc/xxx/fd//proc/xxx/smaps(这里的 xxx 表示进程的 id 或 pid)。

  • 当调试一些之前出现的问题的时候,sar 非常有用。它展示了 cpu、内存以及网络等的历史数据。

  • 关于更深层次的系统分析以及性能分析,看看 stapSystemTap),perf,以及sysdig

  • 查看你当前使用的系统,使用 unameuname -a(Unix/kernel 信息)或者 lsb_release -a(Linux 发行版信息)。

  • 无论什么东西工作得很欢乐(可能是硬件或驱动问题)时可以试试 dmesg

  • 如果你删除了一个文件,但通过 du 发现没有释放预期的磁盘空间,请检查文件是否被进程占用:
    lsof | grep deleted | grep "filename-of-my-big-file"

单行脚本

一些命令组合的例子:

  • 当你需要对文本文件做集合交、并、差运算时,sortuniq 会是你的好帮手。具体例子请参照代码后面的,此处假设 ab 是两内容不同的文件。这种方式效率很高,并且在小文件和上 G 的文件上都能运用(注意尽管在 /tmp 在一个小的根分区上时你可能需要 -T 参数,但是实际上 sort 并不被内存大小约束),参阅前文中关于 LC_ALLsort-u 参数的部分。

    1
    2
    3
    sort a b | uniq > c   # c 是 a 并 b
    sort a b | uniq -d > c # c 是 a 交 b
    sort a b b | uniq -u > c # c 是 a - b
  • 使用 grep . *(每行都会附上文件名)或者 head -100 *(每个文件有一个标题)来阅读检查目录下所有文件的内容。这在检查一个充满配置文件的目录(如 /sys/proc/etc)时特别好用。

  • 计算文本文件第三列中所有数的和(可能比同等作用的 Python 代码快三倍且代码量少三倍):

    1
    awk '{ x += $3 } END { print x }' myfile
  • 如果你想在文件树上查看大小/日期,这可能看起来像递归版的 ls -l 但比 ls -lR 更易于理解:

    1
    find . -type f -ls
  • 假设你有一个类似于 web 服务器日志文件的文本文件,并且一个确定的值只会出现在某些行上,假设一个 acct_id 参数在 URI 中。如果你想计算出每个 acct_id 值有多少次请求,使用如下代码:

    1
    egrep -o 'acct_id=[0-9]+' access.log | cut -d= -f2 | sort | uniq -c | sort -rn
  • 要持续监测文件改动,可以使用 watch,例如检查某个文件夹中文件的改变,可以用 watch -d -n 2 'ls -rtlh | tail';或者在排查 WiFi 设置故障时要监测网络设置的更改,可以用 watch -d -n 2 ifconfig

  • 运行这个函数从这篇文档中随机获取一条技巧(解析 Markdown 文件并抽取项目):

    1
    2
    3
    4
    5
    6
    7
    8
    function taocl() {
    curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README-zh.md|
    pandoc -f markdown -t html |
    iconv -f 'utf-8' -t 'unicode' |
    xmlstarlet fo --html --dropdtd |
    xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" |
    xmlstarlet unesc | fmt -80
    }

冷门但有用

  • expr:计算表达式或正则匹配

  • m4:简单的宏处理器

  • yes:多次打印字符串

  • cal:漂亮的日历

  • env:执行一个命令(脚本文件中很有用)

  • printenv:打印环境变量(调试时或在写脚本文件时很有用)

  • look:查找以特定字符串开头的单词或行

  • cutpastejoin:数据修改

  • fmt:格式化文本段落

  • pr:将文本格式化成页/列形式

  • fold:包裹文本中的几行

  • column:将文本格式化成多个对齐、定宽的列或表格

  • expandunexpand:制表符与空格之间转换

  • nl:添加行号

  • seq:打印数字

  • bc:计算器

  • factor:分解因数

  • gpg:加密并签名文件

  • toe:terminfo 入口列表

  • nc:网络调试及数据传输

  • socat:套接字代理,与 netcat 类似

  • slurm:网络流量可视化

  • dd:文件或设备间传输数据

  • file:确定文件类型

  • tree:以树的形式显示路径和文件,类似于递归的 ls

  • stat:文件信息

  • time:执行命令,并计算执行时间

  • timeout:在指定时长范围内执行命令,并在规定时间结束后停止进程

  • lockfile:使文件只能通过 rm -f 移除

  • logrotate: 切换、压缩以及发送日志文件

  • watch:重复运行同一个命令,展示结果并/或高亮有更改的部分

  • when-changed:当检测到文件更改时执行指定命令。参阅 inotifywaitentr

  • tac:反向输出文件

  • shuf:文件中随机选取几行

  • comm:一行一行的比较排序过的文件

  • strings:从二进制文件中抽取文本

  • tr:转换字母

  • iconvuconv:文本编码转换

  • splitcsplit:分割文件

  • sponge:在写入前读取所有输入,在读取文件后再向同一文件写入时比较有用,例如 grep -v something some-file | sponge some-file

  • units:将一种计量单位转换为另一种等效的计量单位(参阅 /usr/share/units/definitions.units

  • apg:随机生成密码

  • xz:高比例的文件压缩

  • ldd:动态库信息

  • nm:提取 obj 文件中的符号

  • abwrk:web 服务器性能分析

  • strace:调试系统调用

  • mtr:更好的网络调试跟踪工具

  • cssh:可视化的并发 shell

  • rsync:通过 ssh 或本地文件系统同步文件和文件夹

  • wiresharktshark:抓包和网络调试工具

  • ngrep:网络层的 grep

  • hostdig:DNS 查找

  • lsof:列出当前系统打开文件的工具以及查看端口信息

  • dstat:系统状态查看

  • glances:高层次的多子系统总览

  • iostat:硬盘使用状态

  • mpstat: CPU 使用状态

  • vmstat: 内存使用状态

  • htop:top 的加强版

  • last:登入记录

  • w:查看处于登录状态的用户

  • id:用户/组 ID 信息

  • sar:系统历史数据

  • iftopnethogs:套接字及进程的网络利用情况

  • ss:套接字数据

  • dmesg:引导及系统错误信息

  • sysctl: 在内核运行时动态地查看和修改内核的运行参数

  • hdparm:SATA/ATA 磁盘更改及性能分析

  • lsblk:列出块设备信息:以树形展示你的磁盘以及磁盘分区信息

  • lshwlscpulspcilsusbdmidecode:查看硬件信息,包括 CPU、BIOS、RAID、显卡、USB设备等

  • lsmodmodinfo:列出内核模块,并显示其细节

  • fortuneddatesl:额,这主要取决于你是否认为蒸汽火车和莫名其妙的名人名言是否“有用”

仅限 OS X 系统

以下是仅限于 OS X 系统的技巧。

  • brew (Homebrew)或者 port (MacPorts)进行包管理。这些可以用来在 OS X 系统上安装以上的大多数命令。

  • pbcopy 复制任何命令的输出到桌面应用,用 pbpaste 粘贴输入。

  • 若要在 OS X 终端中将 Option 键视为 alt 键(例如在上面介绍的 alt-balt-f 等命令中用到),打开 偏好设置 -> 描述文件 -> 键盘 并勾选“使用 Option 键作为 Meta 键”。

  • open 或者 open -a /Applications/Whatever.app 使用桌面应用打开文件。

  • Spotlight:用 mdfind 搜索文件,用 mdls 列出元数据(例如照片的 EXIF 信息)。

  • 注意 OS X 系统是基于 BSD UNIX 的,许多命令(例如 pslstailawksed)都和 Linux 中有微妙的不同( Linux 很大程度上受到了 System V-style Unix 和 GNU 工具影响)。你可以通过标题为 “BSD General Commands Manual” 的 man 页面发现这些不同。在有些情况下 GNU 版本的命令也可能被安装(例如 gawkgsed 对应 GNU 中的 awk 和 sed )。如果要写跨平台的 Bash 脚本,避免使用这些命令(例如,考虑 Python 或者 perl )或者经过仔细的测试。

  • sw_vers 获取 OS X 的版本信息。

仅限 Windows 系统

以下是仅限于 Windows 系统的技巧。

在 Windows 下获取 Unix 工具

  • 可以安装 Cygwin 允许你在 Microsoft Windows 中体验 Unix shell 的威力。这样的话,本文中介绍的大多数内容都将适用。

  • 在 Windows 10 上,你可以使用 Bash on Ubuntu on Windows,它提供了一个熟悉的 Bash 环境,包含了不少 Unix 命令行工具。好处是它允许 Linux 上编写的程序在 Windows 上运行,而另一方面,Windows 上编写的程序却无法在 Bash 命令行中运行。

  • 如果你在 Windows 上主要想用 GNU 开发者工具(例如 GCC),可以考虑 MinGW 以及它的 MSYS 包,这个包提供了例如 bash,gawk,make 和 grep 的工具。MSYS 并不包含所有可以与 Cygwin 媲美的特性。当制作 Unix 工具的原生 Windows 端口时 MinGW 将特别地有用。

  • 另一个在 Windows 下实现接近 Unix 环境外观效果的选项是 Cash。注意在此环境下只有很少的 Unix 命令和命令行可用。

实用 Windows 命令行工具

  • 可以使用 wmic 在命令行环境下给大部分 Windows 系统管理任务编写脚本以及执行这些任务。

  • Windows 实用的原生命令行网络工具包括 pingipconfigtracert,和 netstat

  • 可以使用 Rundll32 命令来实现许多有用的 Windows 任务

Cygwin 技巧

  • 通过 Cygwin 的包管理器来安装额外的 Unix 程序。

  • 使用 mintty 作为你的命令行窗口。

  • 要访问 Windows 剪贴板,可以通过 /dev/clipboard

  • 运行 cygstart 以通过默认程序打开一个文件。

  • 要访问 Windows 注册表,可以使用 regtool

  • 注意 Windows 驱动器路径 C:\ 在 Cygwin 中用 /cygdrive/c 代表,而 Cygwin 的 / 代表 Windows 中的 C:\cygwin。要转换 Cygwin 和 Windows 风格的路径可以用 cygpath。这在需要调用 Windows 程序的脚本里很有用。

  • 学会使用 wmic,你就可以从命令行执行大多数 Windows 系统管理任务,并编成脚本。

  • 要在 Windows 下获得 Unix 的界面和体验,另一个办法是使用 Cash。需要注意的是,这个环境支持的 Unix 命令和命令行参数非常少。

  • 要在 Windows 上获取 GNU 开发者工具(比如 GCC)的另一个办法是使用 MinGW 以及它的 MSYS 软件包,该软件包提供了 bash、gawk、make、grep 等工具。然而 MSYS 提供的功能没有 Cygwin 完善。MinGW 在创建 Unix 工具的 Windows 原生移植方面非常有用。

什么是 WSL?

全称Windows Subsystem for Linux,是一个在 Windows 10 上能够运行原生 Linux 二进制可执行文件 (ELF 格式) 的兼容层。

区别于虚拟机

使用 VM 虚拟机时通常性能较低,因为需要大量的资源来运行虚拟实例,并且两个操作系统之间缺乏集成,其实仍在运行孤立的单独操作系统。

WSL 解决了这些问题,它集成了 Windows 和 Linux,使用的资源占用量要少得多,与传统的虚拟机相比,所需的资源(CPU、内存、存储)更少。 以令人难以置信的快速高效的性能,在 Linux 开发环境旁边运行 Windows Office 应用、开发工具、游戏等。

原理

WSL 最初于 2016 年 8 月推出(Windows 10 版本 1607),使用的是现在称为 “WSL 1” 的体系结构。 WSL 1 作为一个转换层运行,在 Windows 内核上使用一个 Linux 内核接口。 可将 WSL 1 视为一个兼容层,用于模拟在 Windows 环境中运行 Linux 二进制文件的系统调用。

2019 年 5 月,Microsoft 发布了 WSL 2,引入了对 WSL 体系结构的重要更改,包括在一部分 Hyper-V 功能中使用真正的 Linux 内核。 WSL 2 体系结构显著提高了性能,增加了系统调用速度,并减少了限制。 WSL 2 现在是在 Windows 上安装 Linux 分发版时使用的默认体系结构。

安装 WSL

通过在管理员 PowerShell 或 Windows 命令提示符中输入 wsl --install,然后重启计算机,可以安装运行 WSL 所需的全部内容。

必须确保运行的是 Windows 11 或 Windows 10 版本 2004+(内部版本 19041 及更高版本),才能运行 WSL install 命令。

wsl –install 命令执行以下操作

  1. 启用虚拟机平台可选组件并安装 WSL 核心二进制文件。
  2. 从Microsoft Store 下载 WSL 包(包括最新的 Linux 内核),以便在更新和安全修补程序可用时推送它们。
  3. 下载并安装 Linux。

安装其他 Linux 发行版

认情况下,wsl –install 命令将安装 Linux 的 Ubuntu 发行版。 可以从 Microsoft Store 中提供的列表中选择其他 Linux 发行版。 还可以与默认的 Ubuntu 一起安装其他 Linux 发行版。

若要查看当前通过应用商店提供了哪些发行版,请输入命令:wsl --list --online

若要选择用其他版本替换默认的 Ubuntu 发行版,或者要从应用商店安装其他发行版,使用命令:wsl --install --distribution <Distribution Name>

基本 WSL 命令

  1. wsl --version 检查已安装的 WSL 版本。
  2. wsl --update 命令确保拥有最新的 WSL 更新。
  3. wsl --list --verbose 列出当前已安装的 Linux 发行版。
  4. wsl ~ 命令,打开 Bash 命令行(从设为默认版本的 Linux 发行版),转到 WSL 文件系统的主目录。提示符会变成 Bash,看起来像这样:<user>@<CPU-name>:~$。 输入 pwd 命令以确认目录路径现在类似于 /home/<username>。 输入 explorer.exe . 命令,在 Windows 文件资源管理器中打开该目录(一定要包含句点,它表示打开当前目录路径)。 打开后,可以确认文件路径看起来像这样:\\wsl.localhost\Ubuntu\home\<username>

  1. exit 从 Bash 命令行退出,返回到 PowerShell。

使用 WSL 扩展的 Visual Studio Code

VS Code 使用 WSL 扩展,此扩展使 VS Code 的用户界面能够在 Windows 上运行,命令、扩展、调试、代码自动完成、Lint 分析等都在 WSL Linux 安装上运行。

1、官网下载:
https://nodejs.cn/download/

下载命令:

1
wget https://npmmirror.com/mirrors/node/v18.19.0/node-v18.19.0-linux-x64.tar.xz

2、解压:

1
tar -xf node-v18.19.0-linux-x64.tar.xz

3、确认:

1
2
cd node-v18.19.0-linux-x64
./bin/node -v

4、改名并移动

1
mv node-v18.19.0-linux-x64/* /usr/local/nodejs

5、建立软连接

1
2
sudo ln -s /usr/local/nodejs/bin/node /usr/local/bin/
sudo ln -s /usr/local/nodejs/bin/npm /usr/local/bin/

6、最终确认

1
2
node -v
npm -v

为何要虚拟环境

在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4。所有第三方的包都会被pip安装到Python3的site-packages目录下。

如果我们要同时开发多个应用程序,那这些应用程序都会共用一个Python,就是安装在系统的Python 3。如果应用A需要jinja 2.7,而应用B需要jinja 2.6怎么办?

这种情况下,每个应用可能需要各自拥有一套“独立”的Python运行环境。virtualenv就是用来为一个应用创建一套“隔离”的Python运行环境。

安装virtualenv

首先,我们用pip安装virtualenv:

1
pip install virtualenv

然后,假定我们要开发一个新的项目,需要一套独立的Python运行环境,可以这么做:

使用步骤

创建项目目录

1
mkdir myproject

创建运行环境,命名为venv

1
virtualenv --no-site-packages venv

会看到提示:

1
2
3
4
Using base prefix '/usr/local/.../Python.framework/Versions/3.4'
New python executable in venv/bin/python3.4
Also creating executable in venv/bin/python
Installing setuptools, pip, wheel...done.

命令virtualenv就可以创建一个独立的Python运行环境,我们还加上了参数--no-site-packages,这样,已经安装到系统Python环境中的所有第三方包都不会复制过来,这样,我们就得到了一个不带任何第三方包的“干净”的Python运行环境。

新建的Python环境被放到当前目录下的venv目录。有了venv这个Python环境,可以用source进入该环境:

1
source venv/bin/activate

注意到命令提示符变了,有个(venv)前缀,表示当前环境是一个名为venv的Python环境。

下面正常安装各种第三方包,并运行python命令。

在venv环境下,用pip安装的包都被安装到venv这个环境下,系统Python环境不受任何影响。也就是说,venv环境是专门针对myproject这个应用创建的。

退出当前的venv环境

使用deactivate命令:

1
deactivate 

此时就回到了正常的环境,现在pip或python均是在系统Python环境下执行。

完全可以针对每个应用创建独立的Python运行环境,这样就可以对每个应用的Python环境进行隔离。

原理

virtualenv是如何创建“独立”的Python运行环境的呢?
原理很简单,就是把系统Python复制一份到virtualenv的环境,用命令source venv/bin/activate进入一个virtualenv环境时,virtualenv会修改相关环境变量,让命令python和pip均指向当前的virtualenv环境。

PHP 工程师计划,完成度 70%,进度有了, 但感觉事实不好。因为好多案例自己还不能独立的去完成。内心有些浮躁,总喜欢跳着看视频,看的多,实际完成的很少。

在家自律性完全不足,效率不高,相比在学校哪个状态好真的难说哪个是好的,在学校好的是自由到努力克制自己,所有的事都是自己做,从生活细事中获得自我意识锻炼,缺点是容易受到周围不是很好的环境的影响,即所谓的同化;在家好的是所有的生活的事不用自己去承担,妈妈做好一切,缺点也是明显增加了自己的惰性,在学校能做的非常好的写作习惯,在家缺无法开始,相比学校而言自己写的太少了,练习写作的重要性不言而喻,很多时候却无奈话说了却没有去做。自己一直强调自律,却一直做不到做不好,又特么印证了强调的正是所欠缺的这个说法。
说说团队吧,人总是离不开自己做的事,说的总是自己,人是自私的,但没有办法,思维就是如此。微传媒团队微信部成立了图文小组,计划从内部开始创造一些压力因素来让驱动团队进步,拉了觉得好的两个人,从技能学习开始抓,事实发展和想象的不同,不得不说遇到的阻力让我想放弃,分出精力去盯人明显是个很累的事,要制定适合人的计划,人的接受能力不同要考虑很多因素,千思万虑还是在计划发出后发生了很多问题,两个人就能发生个人事务多导致无法分出时间去学习的事,这对我打击其实还是很大的,在钉钉群聊我说我是直男,用这些话来为自己耿直不亲近的说话语气辩解,总是想着那个方向,一直想着那个方向发现方向在,真实的步伐却迈的很少。以前在团队的时候我是态度很随和的,可能因为孙和钮是两个可爱的软妹子的缘故,我基本没说过什么,两个女生做事做人都很让人放心,现在人换了,需要重新去了解,这个过程难免发生问题,这些问题我从没想过会发生,没有准备,导致自己被打击,另一方面自己无法料及这些事,叫始料未及吧。还是从自己找原因吧,想想现在应该怎么去做,今天下午帮文静做了几个图,发现自己的图片生产力很低了,连续有3天自己没有好好学习php相关的知识了,一天24小时,上午睡掉,下午要慢慢进入状态,有效学习时间是那么短,过了那个时间思绪就飘走,干其他事了,整个一天累积下来沉淀变的好少,自己却一个Plan,我是这么觉得的。想把图文1组的给推掉,不知道为什么现在这么想法总是出现,盯人这事不擅长,自己却不能迎难而上?有两个事自己现在要确定一下,一精力是否真的是那么有限?带好图文1组和自己php工程师的计划能否兼得?带图文1组真的对学习php造成了影响?二自己现在每日时间利用率能否好好的提一下,如通过锻炼身体减少睡眠时间这种方式让整个人的生物规律变的最高效?表面而言两个事都是显而易见的,我现在需要的解决的问题不是认识问题的存在而是如何用能让自己接受的符合发展规律的方式改变自己。
改变自己要好好谈谈又是一个复杂的问题,像绕人的哲学?(笑)改变自己,拿剁鸡做比方,第一有个想法,然后计划,拆解成步骤,一步一步解决,哈哈,说到步骤又自然想计算机了,编程思维!原来一切都是相似相通的哈!这几天我需要做什么?大致这样吧,第一步整理好笔记,制定计划框架,可以单独建立一个笔记本,笔记本作为目录,每个部分开始逐渐完善,像是画画,画出枝干,然后每个枝干去完善,最后完成这个作品。无论作品最终好坏,坚持下去不断填充修改优化,结果肯定好的,坚持最重要!

好久没有到自习室看书,自公考结束后整个人仿佛失去了主心骨,今天来到自习室享受安静,原来自己还能静下心看书。看了《丘吉尔传》好几个章节,看了自己印象笔记收藏的好多关于自我管理和读书的文章,吸收到了满满的正能量。连续好多天没有早起了,眼睛一睁就是中午,冬天早起真的不是个容易的事,最近在寝室比较多,寝室游戏氛围浓厚,让我怀念起了暑假一个人在学校的日子了,可能一个人安静的那种感觉更容易让内心平静吧,现在真的需要安静一下了,想出去旅游一次,想走走看看外面的世界。在学校就没怎么出去过,说是”井底之蛙”感觉倒是很恰当呢。
大四狗,一只脚已经被拎了起来,要踏出校园。内心从一开始对社会的惧怕慢慢地变成期待,期望可以一展拳脚,和死党约好了离开了校园的第一步计划,现在默默等待学期期末考试结束获得自由。刚进入大四这年,心里都是各种留念和舍不得,现在这些心情终于变得平静,大学只是一站,就像以前已经走过的中学一样,没有不散的宴席,到离别时有这种没有任何遗憾的魄力或许比什么都好呢。之前想买单反在毕业前各种拍照的想法应该是要放弃了,时间还是快的让我没有时间再去做这些事,不过没事,眼睛向着前方,一个更好更精彩的明天可以让我忘记昨天,可能将来根本没有时间好好回忆这些昨天的事,不怕我有好多的日记,只要哪天想看过去一眼就能看到的。

大学里觉得最好的经历,已经拥有了,和一群非常优秀的人一起共事过,组建了属于我们自己的团队,很独特很唯一,觉得更多的是幸运。相信这群小伙伴们毕业后都可以大放异彩,毕竟实力在这,哈哈。这个团队让我想了很多事,可能很多时候,带来的会超过本身。学校里有很多团体,很多都是经历了很多年,但是在时间的冲刷下,没有留下什么历史,这是最近一直在脑中思考的事,想到每个人本身,岁岁年年的经历除了年龄在长,形成的沉淀可能真的很少,团体是人和人实现1+1大于2的地方,应该有沉淀有历史,让后面继承者有直接可以吸收的知识经验,很多经历完全可以保存做成案例供下面的借鉴吸收或者用来警示自己,带来了价值肯定会超过本身。于每个人本身而言相信,如果能够好好总结自己的失败和成功经验,小到避免错误再次发生,大到启发升华,意义价值巨大,以史为镜可以知兴替,这话不正是一个很好总结吗?现在是一个多么好的时代,科技进步,每个人都有智能手机或者其它智能设备,可以有文字、声音、图片、视频等等各种形式保留记忆,把现在所想所见保留,将来的时候看到再思考,原来以前自己是这么想的,在时间长河中产生的变化都很珍贵,如果有幸看到变化进行深刻的思考总结,明白变化何来,明白其中深层次的意义,相信这样的价值不可估量。

第三方评测王自如的office tour昨天又看了一遍,他说表面上看起来市场玲琅满目,但是在每个细化领域里找东西发现每个领域里像样的产品又少的可怜。以前看王自如是因为觉得他的评测挺有趣挺对自己口的,现在觉得他还是一个很有思想的人,因为觉得一个人评测做的能带来其它思考启发这真的不容易。看似世界已经发展的很多大很全,实则很多还有很大进步空间,心有多大舞台就有一定会有多大。

最近迷上MacBook,想买一台,自己纠结了很久决定分期,时而肯定时而又想放弃。肯定在能在最想拥有的时候可以拥有是一个很棒的事,以后有经济能力不一定想买了,可能就是一个遗憾了;想放弃是,这对现在的自己而言确实不理性消费,透支未来经济,这么年轻就这么多着实不理性。朋友说我一件简单的事搞的这么纠结,纠结带来的负面效应都大于购买产生的负面效应了,一点魄力都没有。自己的这个性格真的不好,如此没有魄力以后怎么成大事?

自己是一个如此矛盾的人,有时很懒轻松的就选择了堕落,但内心会过意不去,于是就内心开始挣扎开始自我约束,开始放弃于懒惰斗争,如果说这是一个革命,那么这场革命台辛苦了,革命了很多年才取得点滴成效。我想以后自己肯定是一个工作狂什么的,因为自己闲下来就觉得在堕落。现在一直在记录时间,按照每天要做的事划分类别,分别记录时间,有娱乐时间,有学习时间,手机APP可以即使看到各类别的时间占比情况(饼状图),每次看到饼图大大的一块都是娱乐上网什么就特别不舒服,已然成为强迫症。不过因此,现在的时间意识很强烈,做什么事对时间量的控制都是很自然,利弊共存。

说到强迫,有些做法很想提提,因为觉得真的很好。使用电子笔记将生活进行数据化,记录睡眠时间,记录消费,记录待办清单,记录想法等等,一切现在所能想到的都开始记录开始存档。这让自己可以清晰明白自己做了什么和需要做什么,供自己分析,这些原始数据有助于总结沉淀,这和前面提到沉淀又对应了起来,仿佛一切都相通的,开始记录开始思考开始在意想法之后发现如果可以总结思考形成思路,以后遇到相同或相似问题定可以以很高的效率去解决,好处显而易见。 

自习室,这是一个安静向上的地方。在教室里,可以把自己从现实世界带到另一个世界,不管之前心中充满了什么复杂的情绪,教室安静的氛围人安静下来,融入这个地方,与内心对话,与一切平时难以触及的情绪对话。

来到教室,看到很多努力的背影,各自忙碌,奋笔疾书,我想这可能就是将来会想到的学生时代最美画面了。记得是夏天第一次来到这个教室,转眼已经冬天了,教室里还是这群人,不同的衣服,相同的努力。觉得努力的人是最美的,觉得沉浸在书中的人是最美的,一个安静的地方,一坐就是半天,大脑里进行着各种演算,沉醉在书的海洋里。谁说书没有黄金屋,谁说书里没有颜如玉,书都能开启另一个世界了,还有什么不可能?

我想表达是当我们安静下来所有的那个世界,人需要安静,安静可以让人无干扰的思考,思考可以可以解决问题或者规划归来。安静的氛围可以让人瞬间安静下来,一种无形的力量,就像是一种”场”,看不见摸不着,但确确实实有这种力量存在。在这种力量的驱使下,可以很快进入一种状态,即时之前极度悲伤亦或是极度不平静,这都没有什么,在安静的氛围里,静静梳理,这种简单的方式优化自己的内在。在这种状态里,时间的节奏似乎都被改变,忘记了时间,只记得提升的自己。

阅读是一个输入的过程,也许一开始并不知道有什么特别,但是随着阅读的积累,观点的形成,角度的演化,一切井然有序。阅读的越多对知识越求之若渴,知道的越多越知道自己无知,知道的越多态度越谦卑。这是一个一举两得双丰收的过程,既收获知识又改变了心灵。

我是一个对军人无比崇敬和向往的人,痴迷军事题材的影视作品,军人铁的纪律和高效的执行力散发出的巨大的魅力,令我无法自拔。虽然没有成为军人,但还是尽心竭力的模仿学习,从军人身上可以学习到的太多了。军人高强度的训练,和三五好友交流都是敬佩和向往不已,也影响到我暗自下定决定做点什么,才能不枉知道这些。每个人心中都有目标都有梦想,或大或小,都在各自努力,每个人的方式都不尽相同。但思考而言,觉得如果能像军人靠拢,学习军人不折不扣的精神,无疑是一个捷径。对纪律如铁版的遵守执行,因为没有杂念,或许懒惰也就没有缝隙可钻了吧?!联系推广至我们一个人,我们很多人没有做好事的原因不是因为被生活的干扰影响,被琐碎消耗。如果我们坚定信念很多事的问题本该就不会出现,所谓借口不过是杂念的具化。

俗话说好记性不如烂笔头,即使心中想法很多如果没有记录下来,也会忘,所以想要约束自己,首先得使用记录工具,用笔纸或者手机都无妨,将计划按照所想写下,然后重复观看一遍是否可以再优化,考虑好计划的可执行性。为了让计划可行性强,刚开始计划一定要定的简单,因为优秀的计划不是强度好,而是长期坚持累计的效果;为了让计划更有趣,可以模仿游戏的机制,制订个人计划的奖励机制,可以是积分成就的机制;为了让计划能具体落实,计划要尽可能的细致,只有具体到点才能画出线才能形成图。

内心对自律的要求以及外界环境的需要,今年暑假开始了我的自律计划,我选择印象笔记电子记录工具,它可以跨平台同步,简而言之,不论我在哪,不论我使用什么设备,只要可以连接网络就同步我的笔记。为了更好的使用笔记工具,翻遍了印象笔记官方博客、贴吧、微信,了解到了很多关于笔记的好处,学会记录可以提升幸福感可以提升工作效率还有很多相关的,简而言之使用好了笔记可以改变一生(相比不实用任何笔记),这么多的因素下,更加坚定我要使用好笔记。在我的印象笔记中建立日记本、点子本、日常记录本等等好多,根据自己的特点”独家打造”笔记架构,在笔记中建立起了一条条的模板笔记。到今天差不多我的每天都能被我的笔记详细记录下来,包含日常消费、日常事项、与家人通话、健身记录、睡眠记录等等一应俱全。记录下的所有内容都有非常好的价值,可以用来分析反思自己,比如睡眠记录,用来检测以及提醒自己要拥有一个好的睡眠,然而这一切都只是准备工作。在自己正式施行计划后,看到了一个全新的自己,生活井井有条,对比以前的随意和凌乱这种差别简直不要太明显。

还使用了一款叫aTimeLogger的APP,可以精确记录自己的时间并且可以随时显示自己的时间分布。记录自己的时间分配后发现的结果令自己都大吃一斤,每天正在学习的时间没有太多,娱乐上网以及其他所有琐碎占据了生活的大部分时间,这个冷酷的现实数据堪比当头一棒,比任何鸡汤都能刺激人,可以说是让人惊醒。只要养成记录的习惯就好,真实的自己的数据是自己最宝贵的资源。

大四这年如此幸运懂得笔记的重要性,知道了自己该如何规划自己,也明显看到了自己发生了改变,如果有人问我是否需要机会重来一次,我会说不需要,因为现在的自己就很好,我很知足而且幸福。

第二篇博文算是这样零零碎碎的写了吧,反正我的博客和豆瓣也没有什么粉丝,大胆的练练手能有改变和进步才是最重要的!

0%