每个程序员都应该知道的最强大的Unix命令或脚本示例

时间:2009-07-09 10:07:37

标签: unix command-line scripting

所有程序员都应该知道很多事情,但我对我们都应该知道的Unix / Linux命令特别感兴趣。用于完成我们可能在某些时候遇到的任务,例如重构报告网络更新等。

我很好奇的原因是因为我在学习学位期间曾在一家软件公司担任软件测试员,我注意到所有开发人员(正在开发Windows软件)都有2台计算机。

左边是他们的Windows XP开发机器,右边是一个Linux机器。我认为这是Ubuntu。无论如何,他们告诉我他们使用它是因为它提供了Windows在开发过程中无法完成的强大的unix操作。

这让我很奇怪,作为一名软件工程师,您认为您可以在Unix / Linux操作系统上执行哪些最强大的脚本/命令/用途,每个程序员都应该知道这些脚本/命令/用途是为了解决实际任务那可能不一定与编写代码有关吗?

我们都知道 sed awk grep 是做什么的。我对一些已经解决了一个难题的实际Unix / Linux脚本片感兴趣,以便其他程序员可以从中受益。请提供您的故事和来源。

我相信有很多这样的例子,人们会在“ Scripts ”文件夹中保留。

更新:人们似乎误解了这个问题。我不是要求各个unix命令的名称,而是要求解决问题的UNIX代码代码片段

社区的最佳答案


遍历目录树并打印出与正则表达式匹配的任何文件的路径:

find . -exec grep -l -e 'myregex' {} \; >> outfile.txt 

调用默认编辑器(Nano / ViM)

  

(适用于大多数Unix系统,包括Mac OS X)   默认编辑器就是你的   “ EDITOR ”环境变量是   调成。即:出口   编辑= / usr / bin / pico 这是   位于Mac OS下的〜/ .profile   X

Ctrl+x Ctrl+e

列出所有正在运行的网络连接(包括他们所属的应用)

lsof -i -nP

清除终端的搜索记录(我最喜欢的另一个)

history -c

25 个答案:

答案 0 :(得分:19)

我发现commandlinefu.com是各种shell脚本配方的绝佳资源。

实施例

常见

# Run the last command as root
sudo !!

# Rapidly invoke an editor to write a long, complex, or tricky command
ctrl-x ctrl-e

# Execute a command at a given time
echo "ls -l" | at midnight

神秘

# output your microphone to a remote computer's speaker
dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp

答案 1 :(得分:13)

如何退出VI

:WQ

保存文件并结束痛苦。

:wq”的替代方法是“:x”来保存和关闭vi编辑器。

答案 2 :(得分:8)

  • grep
  • awk
  • sed
  • perl
  • 找到

很多Unix的强大功能来自于它操纵文本文件和过滤数据的能力。当然,您可以获得Windows的所有这些命令。它们在操作系统中不是原生的,就像它们在Unix中一样。

以及将命令与管道等链接起来的能力。这可以通过简单的功能创建极其强大的单行命令。

答案 3 :(得分:4)

我这么用,我实在为自己感到羞耻。从所有文件名中删除空格并用下划线替换它们:

<强> [removespaces.sh]

#!/bin/bash
find .  -type f -name "* *" | while read file
do
   mv "$file" "${file// /_}"
done

答案 4 :(得分:4)

你的shell是你可用的最强大的工具

  1. 能够编写简单的循环等
  2. 了解文件通配(例如* .java等)
  3. 能够通过管道,子壳组合命令。重定向等。
  4. 具有该级别的shell知识允许您在命令行上执行大量操作,而无需通过临时文本文件,复制/粘贴等记录信息,并利用大量允许切片的实用程序/切割数据。

    Unix Power Tools会告诉你这么多。每次打开我的副本,我都会找到新的东西。

答案 5 :(得分:3)

我个人最喜欢的是lsof命令。

“lsof”可用于列出已打开的文件描述符,套接字和管道。 我发现在尝试确定哪些进程使用了​​我的计算机上的哪些端口/文件时非常有用。

示例:列出没有主机名解析且没有端口到端口名称转换的所有Internet连接。

lsof -i -nP

http://www.manpagez.com/man/8/lsof/

答案 6 :(得分:3)

如果你在长命令中输入拼写错误,你可以用替换(在bash中)重新运行命令:

mkdir ~/aewseomeDirectory

你可以看到“awesome”被拼错了,你可以输入以下内容来重新运行错误更正的命令

^aew^awe

然后输出它替换的内容(mkdir ~/aweseomeDirectory)并运行命令。 (不要忘记撤消使用错误命令所造成的伤害!)

答案 7 :(得分:2)

tr 命令是Unix中最不受重视的命令:

#Convert all input to upper case
ls | tr a-z A-Z

#take the output and put into a single line 
ls | tr  "\n" " "

#get rid of all numbers
ls -lt | tr -d 0-9

答案 8 :(得分:1)

你们中的一些人可能不同意我的观点,但是,这里有一些可以讨论的东西。如果一个人通过学习gawk(其他变体),可以跳过学习并使用grep / sed / wc / cut / paste和一些其他* nix工具。所有你需要的是一个很好的工具来完成许多组合的工作。

答案 9 :(得分:1)

搜索(多个)格式错误的日志文件的某种方式,其中搜索字符串可以在“孤立的”下一行中找到。例如,在搜索id = 110375时显示第1行和第3行和第4行:

[2008-11-08 07:07:01] [INFO] ...; id = 110375; ...
[2008-11-08 07:07:02] [INFO] ...; id = 238998; ...
[2008-11-08 07:07:03] [ERROR] ... caught exception
...; id = 110375; ...
[2008-11-08 07:07:05] [INFO] ...; id = 800612; ...

我想必须有更好的解决方案(是,添加它们......!),而不是在实际运行sed之前使用grep的两行的以下串联:

#!/bin/bash

if [ $# -ne 1 ]
then
  echo "Usage: `basename $0` id"
  echo "Searches all myproject's logs for the given id"
  exit -1
fi  

# When finding "caught exception" then append the next line into the pattern
# space bij using "N", and next replace the newline with a colon and a space
# to ensure a single line starting with a timestamp, to allow for sorting
# the output of multiple files:
ls -rt /var/www/rails/myproject/shared/log/production.* \
  | xargs cat | sed '/caught exception$/N;s/\n/: /g' \
  | grep "id = $1" | sort

...屈服:

[2008-11-08 07:07:01] [INFO] ...; id = 110375; ...
[2008-11-08 07:07:03] [ERROR] ... caught exception: ...; id = 110375; ...

实际上,更通用的解决方案会将所有(可能是多个)不以某些[timestamp]开头的行附加到其上一行。任何人?当然,不一定使用sed

答案 10 :(得分:1)

for card in `seq 1 8` ;do  
  for ts in `seq  1 31` ; do 
     echo $card $ts >>/etc/tuni.cfg;
   done
 done 

比手工编写愚蠢的248行配置要好。

需要删除所有以'tmp'为前缀的剩余表格

for table in `echo show tables | mysql quotiadb |grep ^tmp` ; do
  echo drop table $table
done

查看输出,重新运行循环并将其传递给mysql

答案 11 :(得分:1)

在解决有问题的linux盒子上的问题时,到目前为止我输入的最常见的键序列是alt+sysrq R E I S U B

答案 12 :(得分:1)

在没有grep本身显示的情况下查找PID

export CUPSPID=`ps -ef | grep cups | grep -v grep | awk '{print $2;}'`

答案 13 :(得分:1)

这些工具(grep find,awk,sed)的强大功能来自于它们的多功能性,因此给出一个特定的案例似乎毫无用处。

man是最强大的命令,因为那时你可以理解你输入的内容,而不是盲目地从堆栈溢出中复制粘贴。

欢迎使用示例,但已有tis主题。 我最常用的是:

grep something_to_find * -R

可以用ack和

代替
find | xargs 

查找结果管道输入xargs可能非常强大

答案 14 :(得分:1)

社区的最佳答案


遍历目录树并打印出与正则表达式匹配的任何文件的路径:

find . -exec grep -l -e 'myregex' {} \; >> outfile.txt 

调用默认编辑器(Nano / ViM)

  

(适用于大多数Unix系统,包括Mac OS X)   默认编辑器就是你的   “ EDITOR ”环境变量是   调成。即:出口   编辑= / usr / bin / pico 这是   位于Mac OS下的〜/ .profile   X

Ctrl+x Ctrl+e

列出所有正在运行的网络连接(包括他们所属的应用)

lsof -i -nP

清除终端的搜索记录(我最喜欢的另一个)

history -c

答案 15 :(得分:0)

你可以在find命令中多次使用-name和-iname,这对我来说是个大开眼界。

<强> [findplaysong.sh]

#!/bin/bash
cd ~
echo Matched...
find /home/musicuser/Music/ -type f  -iname "*$1*" -iname "*$2*" -exec echo {} \;
echo Sleeping 5 seconds
sleep 5
find /home/musicuser/Music/ -type f  -iname "*$1*" -iname "*$2*" -exec mplayer {} \;
exit

答案 16 :(得分:0)

使用!!在bash中重复上一个命令。我经常运行chown otheruser: -R /home/otheruser而忘记使用sudo。如果你忘了sudo,使用!!比箭头更容易然后回家。

sudo !!

我也不是自动解析的主机名和端口名称的粉丝,所以我保留了映射到iptables -nL --line-numbers的iptables的别名。我甚至不确定默认情况下隐藏行号的原因。

最后,如果你想检查进程是否正在侦听端口,那么绑定到正确的地址就可以运行

netstat -nlp

然后你可以grep进程名称或端口号(-n给你数字)。

我也喜欢在终端中使用颜色。我想把它添加到我的bashrc中,以提醒我是否根本不需要阅读它。这实际上帮助了我很多,我再也不会忘记sudo了。

red='\033[1;31m'
green='\033[1;32m'
none='\033[0m'

if [ $(id -u) -eq 0 ];
then
    PS1="[\[$red\]\u\[$none\]@\H \w]$ "
else
    PS1="[\[$green\]\u\[$none\]@\H \w]$ "
fi

这些都是非常简单的命令,但我经常使用它们。他们中的大多数人甚至都应该在我的机器上使用别名。

答案 17 :(得分:0)

:() { :|: &} ;: 

Fork Bomb ,无root权限。

  

自行承担风险。

答案 18 :(得分:0)

启动所有WebService

     find -iname '*weservice*'|xargs -I {} service {} restart

在java子目录中搜索本地类

     find -iname '*.java'|xargs grep 'class Pool'  

在当前路径的子目录中从文件recursivly中查找所有项目:

     cat searches.txt| xargs -I {} -d, -n 1 grep  -r {} 

P.S searching.txt:第一,第二,第三,......,百万

答案 19 :(得分:0)

并行运行多个进程而不会使机器过载(在多处理器体系结构中):

NP=`cat /proc/cpuinfo | grep processor | wc -l`
#your loop here
    if [ `jobs | wc -l` -gt $NP ];
    then
         wait
    fi
    launch_your_task_in_background&
#finish your loop here

答案 20 :(得分:0)

Grep(尝试Windows Grep

sed(尝试Sed for Windows)

事实上,http://gnuwin32.sourceforge.net/提供了一组非常有用的* nix命令的端口。如果你有* nix背景并且现在使用windows,你应该检查它们。

答案 21 :(得分:0)

当某个服务器在一台服务器上运行但在另一台服务器上运行时,以下内容可让您比较所有相关的库:

export MYLIST=`ldd amule | awk ' { print $3; }'`; for a in $MYLIST; do cksum $a; done

将此列表与计算机之间的列表进行比较,您可以快速隔离差异。

答案 22 :(得分:0)

如果你随身携带一张备忘单,你会更好...没有一个可以被称为最有用的命令。如果一个特定的命令使你的工作变得有用和强大

编辑您想要强大的shell脚本吗? shell脚本是程序。获得正确的基础知识,建立在单独的命令上,您将获得所谓的强大脚本。满足您需求的那个是强大的,否则它是无用的。如果你提到问题并询问如何解决它会更好。

答案 23 :(得分:0)

排除一边,但你可以在Windows上获得PowerShell。它非常强大,可以做很多* nix类型的东西。一个很酷的区别是,您使用.net对象而不是文本,如果您使用管道进行过滤等,这可能很有用。

或者,如果您不需要.NET集成,请在Windows框中安装Cygwin。 (并将其目录添加到Windows PATH。)

答案 24 :(得分:-2)

你可以做任何事......

GCC