Если:
cat file
a
b
c
d
e
f match
g
h
i match
j
k
l
m
n
o
Затем:
awk '
{line[NR] = $0}
/match/ {matched[NR]}
END {
for (nr in matched)
for (n=nr-5; n<=nr+5; n+=5)
print line[n]
}
' file
a
f match
k
d
i match
n
Поскольку вы запускаете исполняемый файл в текущем рабочем каталоге, вы должны префикс его с помощью ./. Поэтому для вашей программы запустите ее как ./a.out.
Терминал выполняет поиск исполняемых файлов в $PATH. Это переменная среды Unix, в которой перечислены каталоги, содержащие системные двоичные файлы (например, ls, echo или gcc). Если вы вызываете исполняемый файл, который не находится в каталоге $PATH (например, a.out), вам нужно указать его абсолютный путь в файловой системе.
В терминале . используется синоним текущий рабочий каталог, таким образом ./a.out. Вы также можете назвать /home/yihang/Documents/a.out.
Когда вы запускаете команды в Linux, он ищет все каталоги, перечисленные в переменной среды PATH, и если он не находит команду там, вы получаете сообщение, которое вы видели.
Обычно это выглядит так:
PATH=/usr/local/bin:/usr/bin:/bin
Это означает, что он будет выглядеть первым в /usr/local/bin. Если он не найдет его там, он будет выглядеть в /usr/bin и т. Д.
На самом деле, это очень похоже на DOS / Windows: есть переменная с именем %PATH%, которая точно выполняет То же самое.
Разница в том, что в Windows также выполняется поиск текущего каталога. Unix считает, что это плохо, потому что локальный файл (например, вредоносное ПО) может случайно переопределить важные системные программы.
Если вы предпочитаете это, вы можете заставить Linux работать одинаково, добавив . в путь:
PATH=.:$PATH
(Это говорит, что set PATH - .: плюс существующее содержимое $PATH.)
В итоге он выглядит примерно так (это может быть другое на вашем компьютере):
PATH=.:/usr/local/bin:/usr/bin:/bin
Если вы не хотите этого делать, вы можете просто запустить каждую программу, указав каталог явно:
./myprog
или [!d10 ]
/home/username/myprog
По существу, a.out создается по умолчанию, потому что вы не указали имя для исполняемого файла. Попробуйте это вместо:
gcc HelloWorld.c -o HelloWorld
Как только вы это сделаете, вы сможете вызвать его (как предположил Сунил), предваряя «HelloWorld» точкой слэш (./):
./HelloWorld
Вот ссылка на статью, которая немного объясняет, почему создается a.out: Написание и компиляция C-программ в Linux.
Когда вы запускаете команды в Linux, он ищет все каталоги, перечисленные в переменной среды PATH
, и если он не находит команду там, вы получаете сообщение, которое вы видели.
Обычно это выглядит так:
PATH=/usr/local/bin:/usr/bin:/bin
Это означает, что он будет выглядеть первым в /usr/local/bin
. Если он не найдет его там, он будет выглядеть в /usr/bin
и т. Д.
На самом деле, это очень похоже на DOS / Windows: есть переменная с именем %PATH%
, которая точно выполняет то же самое.
Разница заключается в том, что в Windows также выполняется поиск текущего каталога. Unix считает это плохой, потому что локальный файл (например, вредоносное ПО) может случайно переопределить важные системные программы.
Если вы предпочитаете это, вы можете заставить Linux работать одинаково, добавив .
в путь:
PATH=.:$PATH
(Это говорит, что set PATH
- .:
плюс существующее содержимое $PATH
.)
В результате он выглядит примерно так (это может быть другое на вашем компьютере):
PATH=.:/usr/local/bin:/usr/bin:/bin
Если вы не хотите этого делать, вы можете просто запустить каждую программу, указав каталог явно:
./myprog
или
/home/username/myprog