我有一个文件如下
1 rob hr 10000
2 charls it 20000
4 kk Fin 30000
5 km it 30000
6 kl it 30000
7 mark hr 10000
8 kc it 30000
9 dc fin 40000
10 mn hr 40000
3 abi it 20000
Run Code Online (Sandbox Code Playgroud)
其中4rth列包含第2列中个人的工资.我希望获得第二高工资(或第n个最高工资)的所有记录.样本输出:
4 kk Fin 30000
5 km it 30000
8 kc it 30000
6 kl it 30000
Run Code Online (Sandbox Code Playgroud)
我试过这个:
sort -k4,4 employee.txt | awk 'NR==1{a=$4;next}{if($4>a){print $0 ;exit} else next;}' | a=`awk '{ print $4}'` | awk -v b=$a '$4==b' < …Run Code Online (Sandbox Code Playgroud) 我有一个脚本,显示目录中包含5个或更少字符的文件名:
#!/bin/bash
ls | egrep '^.{0,5}$'
Run Code Online (Sandbox Code Playgroud)
示例目录:
foobar
foo
bar
Run Code Online (Sandbox Code Playgroud)
输出:
foo
bar
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用变量代替5时,如下所示,我得不到输出.没有错误,所以我假设它仍在寻找某种范围.但不是0-5.
#!/bin/bash
declare -i num=5
ls | egrep '^.{0,$num}$'
Run Code Online (Sandbox Code Playgroud)
如何在花括号内使用变量?
在大型文档中,一旦找到模式,计算从模式的下一行到第一个空行的所有行:
...
PATTERN
BBBB
CCCC
...
Run Code Online (Sandbox Code Playgroud)
它应该打印:2
我尝试过的:
awk '/PATTERN/{print $0}' file | wc-l
Run Code Online (Sandbox Code Playgroud) 例如,我的代码中有时会这样做
$var
Run Code Online (Sandbox Code Playgroud)
有时我只是这样做
var
Run Code Online (Sandbox Code Playgroud)
这是一个更具体的例子:
upstream() {
push server_shared_shortname
ssh $server_shared -t "cd ~/public_html; git pull -q ~/root.git master"
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 GNU bash,版本 4.3.11(1)-release (x86_64-pc-linux-gnu)。
$set | grep SHELL
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor:verbose
Run Code Online (Sandbox Code Playgroud)
现在我想将 SHELL 变量的值更改为 /bin/dash。所以我试过了
$set SHELL=/bin/dash
set SHELL=/bin/dash
$set | grep SHELL
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor:verbose
_=SHELL=/bin/dash
Run Code Online (Sandbox Code Playgroud)
我还尝试了其他几种语法。但是 SHELL 变量值不会改变。我有两个问题: 1.如何使用set来改变SHELL变量 2.什么是_=SHELL=/bin/dash?
我正在尝试在函数内打印一个值.但它不起作用; 它正在打印变量名称.这是我的代码:
#!/bin/ksh
MyVariable=""
function ValidateVariableValue
{
eval $1="Working!"
echo "$1" #Here is printing the value "MyVariable" instead of "Working!"
}
ValidateVariableValue MyVariable
echo "value is: ${MyVariable}" #Here is printing the correct value that is "Working!"
Run Code Online (Sandbox Code Playgroud)
你知道怎么打印函数里面的值吗?
我想使用一个命令在终端的三个新终端上打开三个不同的文件夹.所有这些都应该彼此独立运行,这意味着一个命令不依赖于它之前的命令.
这是我的.bash_aliases,它是从.bashrc调用的
alias cmd1=gnome-terminal && cd ~/Desktop/
alias cmd2=gnome-terminal && cd ~/Documents/
alias cmd3=gnome-terminal && cd ~/Music/
alias runcmds='cmd1 & cmd2 & cmd3'
Run Code Online (Sandbox Code Playgroud)
但这会在Music目录中打开三个终端,并且不会正确执行命令.我怎样才能使runcms彼此分开运行所有3个命令?
此外,我什么时候需要使用引号,什么时候不需要?
我有一个类似结构的许多网站的日志文件/var/www/domainname.com/log/access.log,我希望清除他们的内容.我需要找到一种方法在一个命令中执行它,但我似乎没有这样做,我尝试过
find /var/www/ -type f -name "access.log" -exec cat /dev/null > access.log {} \;
Run Code Online (Sandbox Code Playgroud)
但这实际上会创建一个新的access.log文件,复制所有网站的所有访问日志文件的内容.
我在Linux Shell中同时运行多个命令,例如
echo "Line of text 1" && echo "Line of text 2" && complexthing | xargs printf "complexspecifier"
Run Code Online (Sandbox Code Playgroud)
我想将所有输出重定向到file1。我知道我可以>file1在每个单独的命令之后添加,但这似乎很庞大。我怎样才能做到这一点?
我正在尝试简化我的Bash 4脚本.我正在读取文件中的行,我想排除与某些子字符串匹配的行:
while read p; do
if [[ $p != *-ext ]]; then
if [[ $p != *-backend ]]; then
if [[ $p != *-vip ]]; then
echo $p
fi
fi
fi
fi
done < $hostsfile
Run Code Online (Sandbox Code Playgroud)
因此,如果该行不以-ext或-backend或-vip结尾,则打印它.什么是一种更简单的方法(单行程不链接&&'s)来实现这一目标?