我注意到我从其他人那里获得的一些脚本有 shebang#!/path/to/NAME
而其他人(使用相同的工具,NAME)有 shebang #!/usr/bin/env NAME
。
两者似乎都可以正常工作。在教程中(例如在 Python 上),似乎有人建议后者 shebang 更好。但是,我不太明白为什么会这样。
我意识到,为了使用后一个 shebang,NAME 必须在 PATH 中,而第一个 shebang 没有这个限制。
此外,(对我而言)第一个似乎是更好的shebang,因为它精确地指定了NAME 所在的位置。因此,在这种情况下,如果 NAME 有多个版本(例如,/usr/bin/NAME、/usr/local/bin/NAME),第一种情况指定使用哪个。
我的问题是为什么第一个shebang比第二个更受欢迎?
致所有的“sed”医生:
你怎么能得到'sed'来提取它在一行中匹配的正则表达式?
换句话说,我只想要与正则表达式相对应的字符串,其中包含行中的所有非匹配字符都被剥离。
我尝试使用如下所示的反向引用功能
regular expression to be isolated
gets `inserted`
here
|
v
sed -n 's/.*\( \).*/\1/p
Run Code Online (Sandbox Code Playgroud)
这适用于某些表达式,例如
sed -n 's/.*\(CONFIG_[a-zA-Z0-9_]*\).*/\1/p
Run Code Online (Sandbox Code Playgroud)
它巧妙地提取了所有以 'CONFIG_ ....' 开头的宏名称(在某些 '*.h' 文件中找到)并逐行打印出来
CONFIG_AT91_GPIO
CONFIG_DRIVER_AT91EMAC
.
.
CONFIG_USB_ATMEL
CONFIG_USB_OHCI_NEW
.
e.t.c.
Run Code Online (Sandbox Code Playgroud)
但是上面的内容分解为类似的东西
sed -n 's/.*\([0-9][0-9]*\).*/\1/p
Run Code Online (Sandbox Code Playgroud)
这总是返回个位数,如
7
9
.
.
6
Run Code Online (Sandbox Code Playgroud)
而不是提取连续的数字字段,例如。
8908078
89670890
.
.
.
23019
.
e.t.c.
Run Code Online (Sandbox Code Playgroud)
PS:我将非常感谢关于如何在“sed”中实现这一点的反馈。我知道如何使用“grep”和“awk”来做到这一点我想知道我对“sed”的理解(尽管有限)是否有漏洞,以及是否有办法在我
拥有的“sed”中做到这一点简直被忽视了。
我正在尝试 grep 用户名:
users | grep "^\b\w*\b" -P
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它只显示第一场比赛grep
?
我正在尝试确定服务器上的端口 25 是否可用。我尝试使用nc
和telnet
进行连接,但每个都无法连接。
我还能做其他测试来确定该端口上是否有任何东西在监听吗?
是否可以使用gawk
's-i inplace
选项并将内容打印到stdout
?
例如,如果我想更新一个文件,并且如果有任何更改,则将文件名和更改后的行打印到stderr
我可以执行以下操作
find -type f -name 'myfiles' -exec gawk -i inplace '{if(gsub(/pat/, "repl")) { print FILENAME > "/proc/self/fd/2" ; print > "/proc/self/fd/2"; } print;}' {} +
Run Code Online (Sandbox Code Playgroud)
但是有没有办法使用stdout
,或者更简洁的方式将该块打印到备用流?
我怎样才能找到每个空目录,比如说,在 /home/.../Desktop 上。因为我在 Solaris 上,所以无法使用该find . -empty -type d
命令。有没有其他办法?
我有 2 个用户,userA 和 userB。userB 需要以 userA 的身份运行一些命令。我在/etc/sudoers
下面指定了这些选项:
userA ALL=(ALL) ALL
userB ALL=(vinoth) /sbin/fdisk
Run Code Online (Sandbox Code Playgroud)
我以 userB 身份运行此命令:
sudo -u userA fdisk -l
Run Code Online (Sandbox Code Playgroud)
它要求输入用户 B 的密码。一旦我输入了密码,该命令就没有给出 fdisk 输出。
我目前已ipv4.ip_forward
启用在多个接口之间路由数据包。
我现在将系统扩展到 8 个接口,但我想限制接口/地址之间的路由。
一种选择是使用firewalld
,但我将其部署在较旧版本的 RH 上,因此将通过iptables
.
我有以下条目/etc/sudoers
允许我在询问密码后运行任何命令
%sudo ALL=(ALL:ALL) ALL
Run Code Online (Sandbox Code Playgroud)
我还想在脚本中运行一个没有密码的特定命令。我试过将以下行放在 中/etc/sudoers
,但它在我运行时总是要求输入密码。
gmc ALL = NOPASSWD: /sbin/hdparm -C /dev/sdc
Run Code Online (Sandbox Code Playgroud)
有没有办法sudo
在使用通用条目之前使用特定命令?
如何指定 grep 来查找所有可能的值
即,使用如下文件(9701
可以是任何值):
9701=1??
9701=10.Pp
9701=1a 8a
9701=3.a_tt
9701=1/a -00
9701=Bg1998pps
Run Code Online (Sandbox Code Playgroud)
我可以尝试
egrep -Eo '9701=[A-Z]+[a-z]+[0-9]{1,50}' test.log
Run Code Online (Sandbox Code Playgroud)
这只给我大写/小写和数字值。如何在 grep 请求中包含带有特殊字符的值?即,带有空格、点、连字符、下划线等。